Prototype Pattern – giảm chi phí khởi tạo Object.

3 min read

Prototype Pattern là gì

Prototype pattern có nhiệm vụ khởi tạo một đối tượng bằng cách clone một đối tượng đã tồn tại thay vì khởi tạo với từ khoá new. Prototype Pattern được dùng khi việc tạo một object tốn nhiều chi phí và thời gian trong khi bạn đã có một object tương tự tồn tại.

Prototype Pattern được dùng khi việc tạo một object tốn nhiều chi phí và thời gian trong khi bạn đã có một object tương tự tồn tại.

Tại sao lại cần Prototype Pattern

Hãy tưởng tượng bạn đang có một object và muốn tạo một bản sao của chính nó bạn sẽ làm thế nào ?

Đối tượng A ban đầu bạn khởi tạo bằng từ khóa new, ok không vấn đề gì thế nhưng khi bạn muốn khởi tạo đối tượng B giống hệt đối tượng A thì sao?

Dùng “=” chắc chắn là toang đặc biệt với java vấn đề liên quan đến Passing machine chắc chắn sẽ xảy ra.

Cách khác bạn phải tạo một object mới của cùng một lớp. Sau đó, bạn phải đi qua tất cả các field của object gốc và sao chép các giá trị của chúng sang object mới. Không phải tất cả các object đều có thể được sao chép theo cách đó vì một số field của object có thể là phương thức private và không thể sử dụng từ bên ngoài object.

Giải pháp

Prototype Pattern một giao diện chung cho tất cả các đối tượng hỗ trợ nhân bản. Thông thường, một giao diện như vậy chỉ chứa một phương thức sao chép duy nhất.

Phương thức này tạo một object của lớp hiện tại và chuyển tất cả các giá trị field của object cũ sang một object mới. Thậm chí có thể sao chép các private field vì hầu hết các ngôn ngữ lập trình đều cho phép các object truy cập vào các private field của các object khác thuộc cùng một lớp.

Cài đặt Prototype Pattern

Một Prototype Pattern gồm các thành phần cơ bản sau:

  • Prototype: khai báo một class, interface hoặc abtract class cho việc clone chính nó.
  • ConcretePrototype class: các lớp này thực thi interface (hoặc kế thừa từ lớp abstract) được cung cấp bởi Prototype để copy (nhân bản) chính bản thân nó. Các lớp này chính là thể hiện cụ thể phương thức clone(). Lớp này có thể không cần thiết nếu: Prototype là một class và nó đã implement việc clone chính nó.
public class Computer implements Cloneable {
    private String os;
    private String office;
    private String antivirus;
    private String browser;
    private String others;
 
    public Computer(String os, String office, String antivirus, String browser, String other) {
        super();
        this.os = os;
        this.office = office;
        this.antivirus = antivirus;
        this.browser = browser;
        this.others = other;
    }
 
    @Override
    protected Computer clone() {
        try {
            return (Computer) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
 
    @Override
    public String toString() {
        return "Computer [os=" + os + ", office=" + office + ", antivirus=" + antivirus + ", browser=" + browser
                + ", others=" + others + "]";
    }
 
    public void setOthers(String others) {
        this.others = others;
    }
}

Như bạn thấy, computer có đầy đủ các giá trị được clone từ computer1 và chúng ta có thể thay đổi giá trị của computer2 mà không ảnh hưởng đến computer1. 

Ưu & nhược điểm

Prototype ẩn đi những lớp con rời rạc từ phía client, do vậy làm giảm đi số lớp con mà client cần biết. Hơn thế nữa pattern này làm cho client hoạt động với những lớp con cụ thể mà không phải thay đổi gì.

Ưu điểm

  • Thêm và loại bỏ lớp concrete lúc run-time: Prototype hợp nhất quá trình khởi tạo một object mới vào trong hệ thống đơn giản chỉ bằng cách đăng ký một thực thể nguyên mẫu với client. Điều đó linh động hơn một chút so với các mẫu kiến tạo khác bởi vì client có thể cài đặt và loại bỏ các nguyên mẫu tại thời điểm run-time.
  • Khởi tạo object mới bằng cách thay đổi một vài attribute của object (các object có ít điểm khác biệt nhau).
  • Giảm độ phức tạp khi khởi tạo đối tượng.
  • Giảm phân lớp tạo nhiều lớp con.
  • Giảm chi phí khởi tạo so với sử dụng từ khóa new

Nhược điểm

  • Clone các object phức tạp có phụ thuộc vòng (Circular Reference) có thể rất khó.

Link tham khảo

https://viblo.asia/p/prototype-design-pattern-tro-thu-dac-luc-cua-developers-GrLZDBQO5k0

Avatar photo

Leave a Reply

Your email address will not be published. Required fields are marked *