JavaRush /Java блогу /Random-KY /Кофе-брейк №124. Куруучу дизайн үлгүсү. Java'да Сериялашт...

Кофе-брейк №124. Куруучу дизайн үлгүсү. Java'да Сериялаштыруу жана Сериялаштыруу кантип иштейт

Группада жарыяланган

Java'да куруучу дизайн үлгүсү

Булак: Орто Бул макалада биз Builder дизайн үлгүсүн колдонуп класс үчүн an objectтерди кантип долбоорлоону жана түзүүнү үйрөнөбүз . Кофе-брейк №124.  Куруучу дизайн үлгүсү.  Java'да Сериялаштыруу жана Сериялаштыруу кантип иштейт - 1

Эмне үчүн бизге Builder дизайн үлгүсү керек?

Builder үлгүсү тышкы класс менен бирдей маалымат талааларына ээ болгон уя салынган коомдук статикалык классты колдонуу менен an objectтерди түзүү үчүн иштелип чыккан. Куруучу үлгүсү класс an objectисинде көптөгөн талаа маанилери жана/же маалыматтар камтылганда, Фабрика жана Абстракттуу Фабрика дизайн үлгүлөрүндө болгон көйгөйлөрдү чечүү үчүн түзүлгөн . Куруучу үлгүсүнө өтүүдөн мурун , an objectтин талаа маанилери көп болгон сценарийлер үчүн Фабрика жана Абстракттуу Фабрика үлгүлөрүндө кандай көйгөйлөр пайда болоорун карап көрөлү :
  1. Кардар программасынан Factory классына өтүү үчүн өтө көп аргументтерге ээ болуу каталарды жаратышы мүмкүн, анткени көпчүлүк учурда аргументтин түрү бирдей жана кардар тарапта аргументтердин тартибин сактоо кыйын.

  2. Кээ бир параметрлер кошумча болушу мүмкүн, бирок Фабрика үлгүсүндө биз бардык параметрлерди жөнөтүүгө аргасызбыз жана кошумча параметрлер NULL файлдары катары жөнөтүлүшү керек .

  3. Эгерде an object "оор" жана татаал дизайнга ээ болсо, анда бул кыйынчылыктардын баары Factory класстарынын бир бөлүгү болуп калат, бул көп учурда баш аламандыкка алып келет.

Жогорудагы көйгөйлөр an objectтин көп сандагы параметрлери болгондо чечorши мүмкүн. Бул үчүн, жөн гана конструкторду керектүү параметрлер менен камсыз кылуу керек, андан кийин кошумча параметрлерди орнотуу үчүн ар кандай орнотуучу ыкмалары. Бул ыкманын көйгөйү an objectтин абалы бардык атрибуттар так коюлмайынча ыраатсыз бойдон кала берерин эске алыңыз.

Builder дизайн үлгүсү деген эмне?

Builder үлгүсү an objectти этап-этабы менен куруунун жолун камсыз кылуу менен көптөгөн кошумча параметрлерге жана карама-каршы мамлекеттерге ээ болуу маселесин чечет. Бул иш жүзүндө акыркы an objectти кайтарып турган ыкманы колдонот.

Java'да Builder дизайн үлгүсүн кантип ишке ашыруу керек?

Эгерде биз төмөндөгү кадамдарды аткарсак, биз an objectти түзүүнүн жана аны алуунун кадам-кадам процессин алабыз:
  1. Builder классы катары статикалык уя классты түзүп , андан кийин бардык талааларды тышкы класстан Builder классына көчүрүңүз . Биз ат коюу конвенциясына баш ийишибиз керек, андыктан класстын аты Person болсо , анда Builder классы PersonBuilder деп аталышы керек .

  2. Builder классында параметр катары бардык талап кылынган талаалары бар коомдук конструктор болушу керек.

  3. Builder классында кошумча параметрлерди орнотуу ыкмалары болушу керек жана ал кошумча талааны койгондон кийин ошол эле Builder an objectисин кайтарышы керек.

  4. Акыркы кадам - ​​Builder классында build() ыкмасын камсыз кылуу , ал кардар программасы үчүн керектүү an objectти кайтарып берет. Бул үчүн биз аргумент катары Builder классы менен негизги класста жеке конструктор болушубуз керек .

Мисал:

Builder дизайн үлгүсүн так түшүнүү үчүн бир мисалды карап көрөлү .
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();
    }
}
Мисал Builder үлгүсү : java.lang.StringBuilder жана java.lang.StringBuffer an objectтерди куруу үчүн Builder үлгүсүн колдонушкан .

Java'да Сериялаштыруу жана Сериялаштыруу кантип иштейт

Булак: Орто Мен практикадан өткөндөн кийин ушул жылдын январь айында Java тorне өттүм. Буга чейин мен көбүнчө PHP жана бир аз JavaScript жазчумун. Сериялаштыруу чындыгында PHPде бар болсо да, мен буга чейин сериялаштырууга туш болгон эмесмин. Ырас, Javaда ал көп колдонулат. Бүгүн мен сизди Javaда сериалдаштыруу жана сериялаштыруу кантип иштээри жана аларды колдонуунун бир нече жолдору менен тааныштырам.

Сериялаштыруу жана сериялаштыруу деген эмне

Сериялаштыруу – бул an objectти класстан Java Virtual Machine (JVM) ичиндеги byteтардын ырааттуулугуна которуу, башка Java виртуалдык машинасына өткөрүү. Эгерде Java Virtual Machine an objectти byteтардан кайра жаратса, процесс сериядан чыгаруу деп аталат.

Сериялаштыруу жана сериялаштыруу мисалы

Сериялаштыруу

Келгиле, an objectи серияланган класс түзөлү:
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 классы анын an objectисин сериялаштыруу/сериядан чыгаруу үчүн Serializable ишке ашырат . Person классында эки талаа бар: идентификатор жана ат, класстын үлгүсү түзүлгөндө демейки мааниден өзгөрөт. Программада колдонулган Serializable интерфейси жана башка класстар Java.io пакетине импорттолгон .
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();
}
}
}
Белгилүү болгондой, негизги ыкма сериалдаштырууну баштайт жана ийгorктүү кабарды басып чыгарат, антпесе ката кабары басылып чыгат. Объекттерди сериялаштыруу үчүн биз ObjectOutputStream жана writeObject ыкмасын колдонобуз .

Сериядан чыгаруу

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();
}
}
}
Сериялаштыруу сериалдаштыруунун тескериси. Объектти byteтардын ырааттуулугунан кайра куруу үчүн ObjectInputStream жана readObject ыкмасын колдонуңуз . Person классындагы талааларга кирүү мүмкүнчүлүгүн камсыз кылуу үчүн an object Person маалымат түрүнө чыгарыларын эске алыңыз . Сериялаштыруу интерфейсин ишке ашырбаган класс an objectи сериялаштырылbyte. Демек, сериалдаштыруу интерфейсин ишке ашырган класска шилтеме жасаган бардык класстар сериялаштыруу интерфейсин өзү ишке ашырышы керек, антпесе өзгөчө кырдаал ыргытылат. Сериялаштыруу платформадан көзкаранды эмес, демек сериялаштырылган byte агымы башка Java виртуалдык машинасы тарабынан сериядан ажыратылышы мүмкүн. Статикалык жана өтмө талааларды сериялаштыруу мүмкүн эмес, андыктан сериялаштырууну каалабаган талааңыз болсо, аны убактылуу же статикалык кылыңыз. Статикалык талаа болгон учурда, ал серияланbyte, анткени статикалык талаа an objectке эмес, класска таандык. Ушундан улам, өткөөл абал талааны сериялаштырууга жол бербейт. Сериялаштыруу Hibernate, JPA жана RMIде колдонулат. Сериялаштыруу да ылайыкташтырылышы мүмкүн. Бул салттуу сериялоо деп аталат.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION