Java-da inşaatçı dizayn nümunəsi
Mənbə: Orta Bu məqalədə biz Builder dizayn nümunəsindən istifadə edərək sinif üçün obyektlərin necə dizayn ediləcəyini və yaradılmasını öyrənəcəyik .İnşaatçı dizayn nümunəsinə nə üçün ehtiyacımız var?
Qurucu nümunəsi xarici siniflə eyni məlumat sahələrinə malik olan iç içə ictimai statik sinifdən istifadə edərək obyektlər yaratmaq üçün nəzərdə tutulmuşdur. Qurucu nümunəsi, bir sinif obyekti bir çox sahə dəyəri və/və ya məlumatı ehtiva edən zaman Fabrika və Abstrakt Fabrika dizayn nümunələrində mövcud olan problemləri həll etmək üçün yaradılmışdır . Qurucu nümunəsinə keçməzdən əvvəl obyektin çoxlu sahə dəyərlərinə malik olduğu ssenarilər üçün Fabrika və Abstrakt Fabrika nümunələrində hansı problemlərin yarandığına baxaq :-
Müştəri proqramından Fabrika sinfinə keçmək üçün çoxlu arqumentlərin olması səhvlərə səbəb ola bilər, çünki çox vaxt arqument növü eynidir və müştəri tərəfində arqumentlərin sırasını saxlamaq çətindir.
-
Bəzi parametrlər isteğe bağlı ola bilər, lakin Zavod modelində biz bütün parametrləri göndərməyə məcbur oluruq və isteğe bağlı parametrlər NULL faylları kimi göndərilməlidir .
-
Obyekt "ağır" və mürəkkəb dizayna malikdirsə, bütün bu çətinliklər tez-tez çaşqınlığa səbəb olan Zavod siniflərinin bir hissəsi olacaq.
Builder dizayn nümunəsi nədir?
Qurucu nümunəsi, bir obyekti addım-addım qurmaq üçün bir yol təqdim etməklə çoxlu isteğe bağlı parametrlərə və uyğunsuz vəziyyətlərə malik olmaq problemini həll edir. Bu, əslində son obyekti qaytaran bir metoddan istifadə edir.Java-da Builder dizayn nümunəsini necə tətbiq etmək olar?
Aşağıdakı addımları yerinə yetirsək, bir obyekt yaratmaq və onu əldə etmək üçün addım-addım prosesi əldə edirik:-
Builder sinfi kimi statik yuvalanmış sinif yaradın və sonra bütün sahələri xarici sinifdən Builder sinfinə köçürün . Biz adlandırma konvensiyasına əməl etməliyik, ona görə də sinif adı Şəxsiyyətdirsə , Qurucu sinfi PersonBuilder adlandırılmalıdır .
-
Builder sinfinin parametrlər kimi bütün tələb olunan sahələri olan ictimai konstruktoru olmalıdır.
-
Builder sinfi isteğe bağlı parametrləri təyin etmək üçün üsullara malik olmalıdır və isteğe bağlı sahəni təyin etdikdən sonra eyni Builder obyektini qaytarmalıdır .
-
Son addım Builder sinfində müştəri proqramı üçün lazım olan obyekti qaytaracaq build() metodunu təmin etməkdir . Bunu etmək üçün əsas sinifdə arqument olaraq Builder sinfi ilə şəxsi konstruktora sahib olmalıyıq .
Misal:
Builder dizayn nümunəsini aydın şəkildə başa düşmək üçün bir nümunəyə baxaq .public class Employee {
private String name;
private String company;
private boolean hasCar;//optional
private boolean hasBike;//optional
private Employee(EmployeeBuilder employeeBuilder) {
name = employeeBuilder.name;
company = employeeBuilder.company;
hasCar = employeeBuilder.hasCar;
hasBike = employeeBuilder.hasBike;
}
public String getName() {
return name;
}
public String getCompany() {
return company;
}
public boolean isHasCar() {
return hasCar;
}
public boolean isHasBike() {
return hasBike;
}
public static class EmployeeBuilder {
private String name;
private String company;
private boolean hasCar;//optional
private boolean hasBike;//optional
//constructor for required fields
public EmployeeBuilder(String name, String company) {
this.name = name;
this.company = company;
}
//setter methods for optional fields
public EmployeeBuilder setHasCar(boolean hasCar) {
this.hasCar = hasCar;
return this;
}
public EmployeeBuilder setHasBike(boolean hasBike) {
this.hasBike = hasBike;
return this;
}
//Build the Employee object
public Employee build() {
return new Employee(this);
}
}
}
class TestBuilder {
public static void main(String[] args) {
//Building the object of Employee thru the build() method provided in EmployeeBuilder class.
Employee employee = new Employee.EmployeeBuilder("Vikram", "ABC").setHasBike(false).setHasBike(true).build();
}
}
Misal Builder nümunəsi : java.lang.StringBuilder və java.lang.StringBuffer obyektləri qurmaq üçün Builder modelindən istifadə etdi .
Java-da Seriyalaşdırma və Seriyalaşdırma Necə İşləyir
Mənbə: Orta Mən bu ilin yanvar ayında təcrübə keçdikdən sonra Java-ya keçdim. Bundan əvvəl mən əsasən PHP və bir az JavaScript-də yazırdım. Daha əvvəl seriallaşdırma ilə qarşılaşmamışam, baxmayaraq ki, seriallaşdırma PHP-də mövcuddur. Düzdür, Java-da daha tez-tez istifadə olunur. Bu gün sizi Java-da seriallaşdırma və sıradan çıxarma işi və onlardan istifadə etməyin bir neçə yolu ilə tanış edəcəyəm.Serializasiya və serializasiya nədir
Serializasiya, başqa Java Virtual Maşınına ötürülmək üçün obyektin sinifdən Java Virtual Maşınında (JVM) bayt ardıcıllığına çevrilməsidir. Java Virtual Maşını baytlardan obyekti yenidən yaradırsa, bu proses sıradan çıxarma adlanır.Serializasiya və sıradan çıxarma nümunəsi
Serializasiya
Gəlin obyekti seriallaşdırılacaq bir sinif yaradaq:import java.io.*;
public class Person implements Serializable{
int id = 0;
String name = "empty";
public Person(int identity, String nomenclature) {
name = nomenclature;
id = identity;
}
}
Person sinfi Serializable-ı tətbiq edir ki, onun obyekti seriallaşdırıla/seriallaşdırıla bilsin. Person sinfinin iki sahəsi var: identifikator və ad, sinif nümunəsi yaradıldıqda standart dəyərdən dəyişir. Proqramda istifadə olunan Serializable interfeysi və digər siniflər Java.io paketinə idxal edilib .
public static void main(String[] args) throws FileNotFoundException, IOException {
String filename = "filename here";
Person person = new Person(1, "John");
// serialization
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(filename));
try {
out.writeObject(person);
System.out.println("Success");
} catch(Exception e) {
System.out.println("Unsuccessful");
} finally {
if(out != null) {
out.close();
}
}
}
Bildiyiniz kimi, əsas üsul seriallaşdırmaya başlayır və müvəffəqiyyət mesajı çap edir, əks halda səhv mesajı çap olunur. Obyektləri seriallaşdırmaq üçün biz ObjectOutputStream və writeObject metodundan istifadə edirik .
Deserializasiya
public static void main(String[] args) throws FileNotFoundException, IOException {
String filename = "filename here";
Person person = new Person(1, "John");
// Deserialization
ObjectInputStream in = new ObjectInputStream(new FileInputStream(filename));
try {
Person personObj = (Person)in.readObject();
System.out.println("Person Id is " +personObj.id + " while name is " + personObj.name);
} catch (Exception e) {
e.printStackTrace();
} finally {
if(in != null) {
in.close();
}
}
}
Deserializasiya serializasiyanın əksidir. Obyekti bayt ardıcıllığından yenidən qurmaq üçün ObjectInputStream və readObject metodundan istifadə edin . Qeyd edək ki, Person sinifindəki sahələrə girişi təmin etmək üçün obyekt Şəxsiyyət məlumat növünə ötürülür . Serializasiya interfeysini həyata keçirməyən sinif obyekti seriallaşdırıla bilməz. Buna görə də, seriallaşdırma interfeysini həyata keçirən sinfə istinad edən hər hansı bir sinif seriallaşdırma interfeysini özü həyata keçirməlidir, əks halda istisna atılacaq. Serializasiya platformadan müstəqildir, yəni seriallaşdırılan bayt axını başqa Java Virtual Maşın tərəfindən seriyadan çıxarıla bilər. Statik və keçici sahələr seriallaşdırıla bilməz, ona görə də seriallaşdırmaq istəmədiyiniz sahəniz varsa, onu müvəqqəti və ya statik edin. Statik sahə olduğu halda, o, seriallaşdırılmır, çünki statik sahə obyektə deyil, sinifə aiddir. Buna görə keçid vəziyyəti sahənin seriallaşdırılmasının qarşısını alır. Serializasiya Hibernate, JPA və RMI-də istifadə olunur. Serializasiya da fərdiləşdirilə bilər. Buna xüsusi serializasiya deyilir.
GO TO FULL VERSION