JavaRush /Java blogi /Random-UZ /Kofe tanaffusi №124. Quruvchi dizayn namunasi. Java-da se...

Kofe tanaffusi №124. Quruvchi dizayn namunasi. Java-da seriyalilashtirish va seriyasizlashtirish qanday ishlaydi

Guruhda nashr etilgan

Java-da quruvchi dizayn namunasi

Manba: O'rta Ushbu maqolada biz Builder dizayn naqshidan foydalangan holda sinf uchun ob'ektlarni qanday loyihalash va yaratishni o'rganamiz . Kofe tanaffusi №124.  Quruvchi dizayn namunasi.  Java-da seriyalilashtirish va seriyasizlashtirish qanday ishlaydi - 1

Nima uchun bizga Builder dizayn namunasi kerak?

Quruvchi namunasi tashqi sinf bilan bir xil ma'lumotlar maydonlariga ega bo'lgan ichki umumiy statik sinfdan foydalangan holda ob'ektlarni yaratish uchun mo'ljallangan. Quruvchi namunasi sinf ob'ekti ko'plab maydon qiymatlari va/yoki ma'lumotlarni o'z ichiga olgan bo'lsa, zavod va abstrakt zavod dizayn naqshlarida mavjud bo'lgan muammolarni hal qilish uchun yaratilgan . Quruvchi naqshiga o'tishdan oldin , ob'ekt ko'p maydon qiymatlariga ega bo'lgan stsenariylar uchun Zavod va Abstrakt zavod naqshlarida qanday muammolar yuzaga kelishini ko'rib chiqaylik :
  1. Mijoz dasturidan Factory sinfiga o'tish uchun juda ko'p argumentlarga ega bo'lish xatolarga olib kelishi mumkin, chunki ko'pincha argument turi bir xil bo'ladi va mijoz tomonidan argumentlar tartibini saqlash qiyin.

  2. Ba'zi parametrlar ixtiyoriy bo'lishi mumkin, lekin zavod naqshida biz barcha parametrlarni yuborishga majburmiz va ixtiyoriy parametrlar NULL fayllar sifatida yuborilishi kerak .

  3. Agar ob'ekt "og'ir" va murakkab dizaynga ega bo'lsa, unda bu qiyinchiliklarning barchasi zavod sinflarining bir qismiga aylanadi, bu ko'pincha chalkashlikka olib keladi.

Yuqoridagi muammolarni ob'ekt ko'p sonli parametrlarga ega bo'lganda hal qilish mumkin. Buni amalga oshirish uchun konstruktorga kerakli parametrlarni taqdim etishingiz kerak, so'ngra ixtiyoriy parametrlarni o'rnatish uchun turli xil sozlash usullari. E'tibor bering, bu usul bilan bog'liq muammo shundaki, agar barcha atributlar aniq o'rnatilmasa, ob'ektning holati mos kelmaydi.

Quruvchi dizayn namunasi nima?

Quruvchi namunasi ob'ektni bosqichma-bosqich qurish usulini taqdim etish orqali ko'plab ixtiyoriy parametrlar va nomuvofiq holatlarga ega bo'lish muammosini hal qiladi. Bu aslida yakuniy ob'ektni qaytaradigan usuldan foydalanadi.

Java-da Builder dizayn naqshini qanday amalga oshirish mumkin?

Agar biz quyidagi amallarni bajarsak, biz ob'ektni yaratish va uni olishning bosqichma-bosqich jarayonini olamiz:
  1. Builder sinfi sifatida statik ichki sinf yarating va keyin barcha maydonlarni tashqi sinfdan Builder sinfiga nusxalang . Biz nomlash qoidalariga rioya qilishimiz kerak, shuning uchun sinf nomi Person bo'lsa , Builder sinfi PersonBuilder deb nomlanishi kerak .

  2. Builder klassi parametr sifatida barcha kerakli maydonlarga ega umumiy konstruktorga ega bo'lishi kerak.

  3. Builder sinfida ixtiyoriy parametrlarni o'rnatish usullari bo'lishi kerak va u ixtiyoriy maydonni o'rnatgandan so'ng bir xil Builder ob'ektini qaytarishi kerak.

  4. Oxirgi qadam , mijoz dasturiga kerak bo'lgan ob'ektni qaytaradigan Builder sinfida build() usulini taqdim etishdir . Buning uchun asosiy sinfda argument sifatida Builder sinfi bilan xususiy konstruktorga ega bo'lishimiz kerak.

Misol:

Quruvchi dizayn namunasini aniq tushunish uchun misolni ko'rib chiqaylik .
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();
    }
}
Misol Builder naqsh : java.lang.StringBuilder va java.lang.StringBuffer ob'ektlarni qurish uchun Builder naqshidan foydalangan .

Java-da seriyalilashtirish va seriyasizlashtirish qanday ishlaydi

Manba: Medium Shu yilning yanvar oyida amaliyotdan so'ng Java tiliga o'tdim. Bungacha men asosan PHP va biroz JavaScript-da yozardim. Men oldin hech qachon serializatsiyaga duch kelmaganman, garchi serializatsiya PHP da mavjud bo'lsa ham. To'g'ri, Java-da u ko'proq ishlatiladi. Bugun men sizni Java-da serializatsiya va deserializatsiya qanday ishlashi va ulardan foydalanishning bir necha usullari bilan tanishtiraman.

Seriyalashtirish va deserializatsiya nima

Seriyalashtirish - bu ob'ektni sinfdan boshqa Java virtual mashinasiga uzatish uchun Java Virtual Machine (JVM)dagi baytlar ketma-ketligiga aylantirish. Agar Java virtual mashinasi ob'ektni baytlardan qayta yaratsa, bu jarayon deserializatsiya deb ataladi.

Seriyalashtirish va seriyadan chiqarishga misol

Seriyalashtirish

Ob'ekti ketma-ketlashtiriladigan sinf yarataylik:
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 klassi Serializable- ni amalga oshiradi , shunda uning ob'ekti ketma-ketlashtiriladi/seriyadan chiqariladi. Person sinfida ikkita maydon mavjud: identifikator va nom, ular sinfning namunasi yaratilganda standart qiymatdan o'zgaradi. Serializable interfeysi va dasturda foydalanilgan boshqa sinflar Java.io paketiga import qilingan .
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();
}
}
}
Ma'lumki, asosiy usul ketma-ketlashtirishni boshlaydi va muvaffaqiyatli xabarni chop etadi, aks holda xato xabari chop etiladi. Ob'ektlarni ketma-ketlashtirish uchun biz ObjectOutputStream va writeObject usulidan foydalanamiz .

Seriyadan chiqarish

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();
}
}
}
Seriyadan chiqarish ketma-ketlashtirishning teskarisidir. Ob'ektni baytlar ketma-ketligidan qayta qurish uchun ObjectInputStream va readObject usulidan foydalaning . Esda tutingki, Person sinfidagi maydonlarga kirishni ta'minlash uchun ob'ekt Shaxs ma'lumotlar turiga o'tkaziladi . Serializatsiya interfeysini amalga oshirmaydigan sinf ob'ektini seriyalashtirib bo'lmaydi. Shuning uchun, ketma-ketlashtirish interfeysini amalga oshiradigan sinfga murojaat qiladigan har qanday sinf ketma-ketlashtirish interfeysini o'zi amalga oshirishi kerak, aks holda istisno chiqariladi. Seriyalashtirish platformadan mustaqil, ya'ni seriyali bayt oqimi boshqa Java virtual mashinasi tomonidan seriyadan chiqarilishi mumkin. Statik va oʻtkinchi maydonlarni ketma-ketlashtirib boʻlmaydi, shuning uchun siz ketma-ketlashtirmoqchi boʻlmagan maydoningiz boʻlsa, uni vaqtinchalik yoki statik qilib qoʻying. Statik maydon bo'lsa, u ketma-ketlashtirilmaydi, chunki statik maydon ob'ektga emas, balki sinfga tegishli. Shu sababli, o'tish holati maydonni ketma-ketlashtirishga to'sqinlik qiladi. Seriyalashtirish Hibernate, JPA va RMI da qo'llaniladi. Serializatsiya ham moslashtirilgan bo'lishi mumkin. Bu maxsus seriyalash deb ataladi.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION