JavaRush /Blog Java /Random-VI /Nghỉ giải lao #124. Mẫu thiết kế của nhà xây dựng. Cách t...

Nghỉ giải lao #124. Mẫu thiết kế của nhà xây dựng. Cách tuần tự hóa và giải tuần tự hóa hoạt động trong Java

Xuất bản trong nhóm

Mẫu thiết kế trình xây dựng trong Java

Nguồn: Medium Trong bài viết này, chúng ta sẽ tìm hiểu cách thiết kế và tạo các đối tượng cho một lớp bằng cách sử dụng mẫu thiết kế Builder . Nghỉ giải lao #124.  Mẫu thiết kế của nhà xây dựng.  Cách tuần tự hóa và giải tuần tự hóa hoạt động trong Java - 1

Tại sao chúng ta cần mẫu thiết kế Builder?

Mẫu Builder được thiết kế để tạo các đối tượng bằng cách sử dụng lớp tĩnh công khai lồng nhau có cùng trường dữ liệu với lớp bên ngoài. Mẫu Builder được tạo để giải quyết các vấn đề tồn tại trong các mẫu thiết kế FactoryTóm tắt Factory khi một đối tượng lớp chứa nhiều giá trị trường và/hoặc dữ liệu. Trước khi chuyển sang mẫu Builder , chúng ta hãy xem chính xác những vấn đề phát sinh với các mẫu FactoryTóm tắt Factory cho các kịch bản trong đó một đối tượng có nhiều giá trị trường:
  1. Việc có quá nhiều đối số để chuyển từ chương trình máy khách sang lớp Factory có thể gây ra lỗi vì hầu hết các loại đối số đều giống nhau và rất khó để duy trì thứ tự của các đối số ở phía máy khách.

  2. Một số tham số có thể là tùy chọn, nhưng trong mẫu Factory chúng ta buộc phải gửi tất cả các tham số và các tham số tùy chọn phải được gửi dưới dạng tệp NULL .

  3. Nếu đối tượng “nặng” và có thiết kế phức tạp thì tất cả những khó khăn này sẽ trở thành một phần của các lớp Factory, điều này thường dẫn đến sự nhầm lẫn.

Các vấn đề trên có thể được giải quyết khi đối tượng có số lượng tham số lớn. Để thực hiện việc này, bạn chỉ cần cung cấp cho hàm tạo các tham số bắt buộc và sau đó là các phương thức setter khác nhau để đặt các tham số tùy chọn. Lưu ý rằng vấn đề với phương pháp này là trạng thái của đối tượng sẽ không nhất quán trừ khi tất cả các thuộc tính được đặt rõ ràng.

Mẫu thiết kế Builder là gì?

Mẫu Builder giải quyết vấn đề có nhiều tham số tùy chọn và trạng thái không nhất quán bằng cách cung cấp cách xây dựng đối tượng theo từng bước. Điều này sử dụng một phương thức thực sự trả về đối tượng cuối cùng.

Làm cách nào để triển khai mẫu thiết kế Builder trong Java?

Nếu làm theo các bước bên dưới, chúng ta sẽ có được quy trình từng bước tạo một đối tượng và nhận được nó:
  1. Tạo một lớp lồng tĩnh làm lớp Builder , sau đó sao chép tất cả các trường từ lớp bên ngoài sang lớp Builder . Chúng ta phải tuân theo quy ước đặt tên, vì vậy nếu tên lớp là Person thì lớp Builder sẽ được gọi là PersonBuilder .

  2. Lớp Builder phải có một hàm tạo công khai với tất cả các trường bắt buộc làm tham số.

  3. Lớp Builder phải có các phương thức để thiết lập các tham số tùy chọn và nó phải trả về cùng một đối tượng Builder sau khi thiết lập trường tùy chọn.

  4. Bước cuối cùng là cung cấp phương thức build() trong lớp Builder , phương thức này sẽ trả về đối tượng mà chương trình khách cần. Để làm điều này, chúng ta cần có một hàm tạo riêng trong lớp chính với lớp Builder làm đối số.

Ví dụ:

Hãy xem một ví dụ để hiểu rõ hơn về mẫu thiết kế 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();
    }
}
Mẫu Builder mẫu : java.lang.StringBuilderjava.lang.StringBuffer đã sử dụng mẫu Builder để xây dựng các đối tượng.

Cách tuần tự hóa và giải tuần tự hóa hoạt động trong Java

Nguồn: Medium Tôi đã chuyển sang Java vào tháng 1 năm nay sau một thời gian thực tập. Trước đây, tôi chủ yếu viết bằng PHP và một ít JavaScript. Tôi chưa bao giờ gặp phải vấn đề tuần tự hóa trước đây, mặc dù việc tuần tự hóa thực sự tồn tại trong PHP. Đúng, trong Java nó được sử dụng thường xuyên hơn nhiều. Hôm nay tôi sẽ giới thiệu cho bạn cách tuần tự hóa và giải tuần tự hóa hoạt động trong Java và một số cách để sử dụng chúng.

Tuần tự hóa và giải tuần tự hóa là gì

Tuần tự hóa là việc chuyển đổi một đối tượng từ một lớp thành một chuỗi byte trong Máy ảo Java (JVM) để truyền sang Máy ảo Java khác. Nếu Máy ảo Java tạo lại một đối tượng từ byte, quá trình này được gọi là giải tuần tự hóa.

Ví dụ về tuần tự hóa và giải tuần tự hóa

Tuần tự hóa

Hãy tạo một lớp có đối tượng sẽ được tuần tự hóa:
import java.io.*;

public class Person implements Serializable{

int id = 0;
String name = "empty";

public Person(int identity, String nomenclature) {

name = nomenclature;
id = identity;
}
}
Lớp Person triển khai Serializable để đối tượng của nó có thể được tuần tự hóa/giải tuần tự hóa. Lớp Person có hai trường: mã định danh và tên, thay đổi từ giá trị mặc định khi một phiên bản của lớp được tạo. Giao diện Serializable và các lớp khác được sử dụng trong chương trình đã được nhập vào gói 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();
}
}
}
Như bạn đã biết, phương thức chính bắt đầu tuần tự hóa và in thông báo thành công, nếu không thì thông báo lỗi sẽ được in. Để tuần tự hóa các đối tượng, chúng tôi sử dụng ObjectOutputStream và phương thức writeObject .

Khử lưu huỳnh

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();
}
}
}
Deserialization là sự đảo ngược của serialization. Để xây dựng lại một đối tượng từ một chuỗi byte, hãy sử dụng ObjectInputStream và phương thức readObject . Lưu ý rằng để cung cấp quyền truy cập vào các trường trong lớp Person , đối tượng sẽ được chuyển sang kiểu dữ liệu Person . Một đối tượng lớp không triển khai giao diện tuần tự hóa thì không thể được tuần tự hóa. Do đó, bất kỳ lớp nào tham chiếu đến lớp thực hiện giao diện tuần tự hóa đều phải tự triển khai giao diện tuần tự hóa, nếu không sẽ đưa ra một ngoại lệ. Quá trình tuần tự hóa độc lập với nền tảng, nghĩa là luồng byte đang được tuần tự hóa có thể được giải tuần tự hóa bởi một Máy ảo Java khác. Các trường tĩnh và nhất thời không thể tuần tự hóa được, vì vậy nếu bạn có một trường mà bạn không muốn tuần tự hóa, hãy đặt trường đó là tạm thời hoặc tĩnh. Trong trường hợp trường tĩnh, nó không được tuần tự hóa vì trường tĩnh thuộc về một lớp chứ không phải một đối tượng. Do đó, trạng thái chuyển tiếp sẽ ngăn trường được tuần tự hóa. Tuần tự hóa được sử dụng trong Hibernate, JPA và RMI. Việc tuần tự hóa cũng có thể được tùy chỉnh. Điều này được gọi là tuần tự hóa tùy chỉnh.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION