Giới thiệu về Prototype Design Pattern

Chúng tôi vui mừng chia sẻ kiến thức về từ khóa Prototype pattern la gi và hy vọng rằng nó sẽ hữu ích cho bạn đọc. Bài viết tập trung trình bày ý nghĩa, vai trò và ứng dụng của từ khóa này trong việc tối ưu hóa nội dung trang web và chiến dịch tiếp thị trực tuyến. Chúng tôi cung cấp các phương pháp tìm kiếm, phân tích và lựa chọn từ khóa phù hợp, cùng với các chiến lược và công cụ hữu ích. Hy vọng rằng thông tin mà chúng tôi chia sẻ sẽ giúp bạn xây dựng chiến lược thành công và thu hút lưu lượng người dùng. Xin chân thành cảm ơn sự quan tâm và hãy tiếp tục theo dõi blog của chúng tôi để cập nhật những kiến thức mới nhất.

Ý đồ

Prototype là một creational design pattern được chấp nhận bạn sao chép các object hiện có mà không làm cho code của bạn phụ thuộc vào các class của chúng.

Bạn Đang Xem: Giới thiệu về Prototype Design Pattern

Vấn đề

Giả sử bạn có một object và bạn muốn tạo một bản sao của nó. Các bạn sẽ làm điều này ra sao? Trước tiên, bạn phải tạo một object mới của cùng một class. Sau đó, bạn phải sao chép giá trị của tất cả những trường từ object gốc sang object mới.

OK, đến đây là bạn nghĩ vấn đề đã được xử lý đúng không nào? Nhưng thực ra có một vấn đề, là không phải tất cả những object đều phải có thể được sao chép Theo phong cách đó vì một số trường của object có thể là private và không thể nhìn thấy từ phía bên ngoài object.

Không phải lúc nào tất cả chúng ta cũng sẽ có thể sao chép một object “từ phía bên ngoài”

Có một vấn đề nữa với phương pháp tiếp cận trực tiếp vừa kể trên. Vì bạn phải ghi nhận class của object để tạo bản sao, code của các bạn sẽ phụ thuộc vào class đó. Nếu như khách hàng OK với việc bị phụ thuộc đó, thì lại còn một vấn đề khác nữa. Thỉnh thoảng bạn chỉ biết interface mà object implement, nhưng không biết class cụ thể của nó, ví dụ, khi một thông số trong một phương thức gật đầu bất kỳ object nào implement một interface nào đó.

Giải pháp

Design pattern Prototype ủy thác quá trình nhân văn cho những object thực tế là đối tượng người dùng của việc nhân văn. Design pattern khai báo một interface chung cho tất cả những object tương trợ nhân văn. Interface này được chấp nhận bạn sao chép một object mà không cần couple code của bạn với class của object đó. Thông thường, một interface như vậy chỉ chứa một phương thức clone duy nhất.

Việc triển khai phương thức clone là rất giống nhau trong tất cả những class. Phương thức này tạo một object của class ngày nay và chuyển tất cả những giá trị trường của object cũ sang một object mới. Bạn thậm chí còn có thể sao chép các trường riêng tư vì hồ hết các tiếng nói lập trình đều được chấp nhận các object truy cập các trường private của tương đối nhiều object khác thuộc cùng một class.

Một object tương trợ nhân văn được gọi là một prototype. Lúc các object của bạn có hàng ngàn trường và hàng trăm cách các trường đó phối phối hợp, thì việc nhân văn chúng có thể là một giải pháp thay thế cho subclassing.

Prototype được tạo sẵn có thể là lựa chọn thay thế cho subclassing

Cách hoạt động của design pattern này như sau: Bạn tạo một tập hợp các object, được định cấu hình theo vô số cách thức khác nhau. Khi bạn cần phải một object giống như object bạn đã định cấu hình, bạn chỉ có sao chép một prototype thay vì xây dựng một object mới từ trên đầu.

Ví dụ trong thế giới thực

Trong thế giới thực, prototype được sử dụng để thực hiện các thử nghiệm trước lúc khai mạc sinh sản hàng loạt một sản phẩm. Tuy nhiên, trong trường hợp này, các prototype không tham gia vào bất kỳ quá trình sinh sản thực tế nào, thay vào đó đóng vai trò thụ động.

Xem Thêm : CS:GO: Tất tần tật về Skin vũ khí trong CS:GO mà bạn cần biết

Sự phân chia tế bào

Vì các prototypes trong công nghiệp không thực sự tự sao chép, một ví dụ gần hơn với Design pattern này là quá trình phân bào giảm nhiễm. Sau thời điểm nguyên phân, một cặp tế bào y sì nhau được hình thành. Tế bào gốc hoạt động như một prototype và có vai trò dữ thế chủ động trong việc tạo ra bản sao.

Cấu trúc

Implementation cơ bản

  1. Interface Prototype khai báo các phương pháp nhân văn. Trong hồ hết các trường hợp, người ta chỉ khai báo một phương pháp clone duy nhất.

  2. Class Concrete Prototype implement phương thức nhân văn. Ngoài việc sao chép tài liệu của object gốc sang bản sao, phương pháp này cũng sẽ có thể xử lý một số trường hợp biên của quá trình sao chép liên quan đến việc sao chép các Object được liên kết, tháo gỡ các recursive dependencie, v.v.

  3. Client có thể tạo một bản sao của bất kỳ object nào, miễn sao object đó implment Interface prototype.

Giả mã

Trong ví dụ này, Prototype design pattern được chấp nhận tất cả chúng ta tạo các bản sao chuẩn xác của tương đối nhiều object hình dạng mà không cần couple code với những class của chúng.

Nhân văn một tập hợp các object thuộc một class hierarchy.

Tất cả những class hình dạng cùng implement một interface. Interface này cung cấp một phương pháp nhân văn. Một class con có thể gọi phương thức sao chép của class cha trước lúc sao chép các giá trị các trường của chính nó vào object kết quả.

// Base prototype. abstract class Shape is field X: int field Y: int field color: string // A regular constructor. constructor Shape() is // … // The prototype constructor. A fresh object is initialized // with values from the existing object. constructor Shape(source: Shape) is this() this.X = source.X this.Y = source.Y this.color = source.color // The clone operation returns one of the Shape subclasses. abstract method clone():Shape // Concrete prototype. The cloning method creates a new object // and passes it to the constructor. Until the constructor is // finished, it has a reference to a fresh clone. Therefore, // nobody has access to a partly-built clone. This keeps the // cloning result consistent. class Rectangle extends Shape is field width: int field height: int constructor Rectangle(source: Rectangle) is // A parent constructor call is needed to copy private // fields defined in the parent class. super(source) this.width = source.width this.height = source.height method clone():Shape is return new Rectangle(this) class Circle extends Shape is field radius: int constructor Circle(source: Circle) is super(source) this.radius = source.radius method clone():Shape is return new Circle(this) // Somewhere in the client code. class Application is field shapes: array of Shape constructor Application() is Circle circle = new Circle() circle.X = 10 circle.Y = 10 circle.radius = 20 shapes.add(circle) Circle anotherCircle = circle.clone() shapes.add(anotherCircle) // The `anotherCircle` variable contains an exact copy // of the `circle` object. Rectangle rectangle = new Rectangle() rectangle.width = 10 rectangle.height = 20 shapes.add(rectangle) method businessLogic() is // Prototype rocks because it lets you produce a copy of // an object without knowing anything about its type. Array shapesCopy = new Array of Shapes. // For instance, we don’t know the exact elements in the // shapes array. All we know is that they are all // shapes. But thanks to polymorphism, when we call the // `clone` method on a shape the program checks its real // class and runs the appropriate clone method defined // in that class. That’s why we get proper clones // instead of a set of simple Shape objects. foreach (s in shapes) do shapesCopy.add(s.clone()) // The `shapesCopy` array contains exact copies of the // `shape` array’s children.

Tính ứng dụng

1. Sử dụng design pattern prototype khi chúng ta không muốn code bị phụ thuộc vào các concrete class của object cụ thể mà bạn cần phải sao chép. Điều này xẩy ra rất nhiều khi code của bạn hoạt động với những object được pass từ code của bên thứ 3 thông qua interface. Bạn không biết class cụ thể của những object này, nên bạn có muốn phụ thuộc cũng không thể.

Design pattern prototype cung cấp cho code client một interface chung để chúng ta có thể thao tác làm việc với tất cả những object tương trợ nhân văn. Interface này làm cho code client độc lập với những class cụ thể của tương đối nhiều object mà nó sao chép.

2. Sử dụng pattern này khi chúng ta muốn giảm số lượng các class con chỉ khác nhau về phong thái khởi tạo. Ai đó có thể đã tạo ra các class con này để khởi tạo các object với một cấu hình cụ thể.

Design pattern prototype được chấp nhận bạn sử dụng một tập hợp các object được tạo sẵn, được cấu hình theo vô số cách thức khác nhau, để làm prototype.

Thay vì khởi tạo một class con phù phù hợp với một số cấu hình, client có thể chỉ có tìm kiếm một prototype thích hợp và sao chép nó.

Cách triển khai

  1. Xem Thêm : MRO là gì? Tầm quan trọng của quản lý hàng hóa MRO

    Tạo interface prototype và khai báo phương thức clone trong đó. Hoặc chỉ có thêm phương thức vào tất cả những class của class hierarchy nếu có.

  2. Một class prototype phải xác định phương thức khởi tạo thay thế nhận một object của class đó làm argument. Hàm tạo phải sao chép giá trị của tất cả những trường được khái niệm trong class từ object được truyền vào instance mới được tạo. Nếu như khách hàng đang thay đổi một class con, bạn phải gọi hàm tạo cha để được chấp nhận class cha xử lý việc sao chép các trường riêng tư của nó.

Nếu tiếng nói lập trình bạn dùng không tương trợ method overloading, chúng ta có thể khái niệm một phương pháp đặc biệt quan trọng để sao chép tài liệu object. Constructor là nơi thích hợp để làm điều này vì nó cung cấp object kết quả ngay sau khi chúng ta gọi operator new.

  1. Phương thức nhân văn thường chỉ gồm có một dòng: chạy new với phiên bản constructor dùng để làm tạo prototype. Lưu ý rằng mọi class phải override rõ ràng phương thức nhân văn và sử dụng tên class của chính nó khi gọi new. Nếu không, phương thức nhân văn có thể tạo ra một object của class cha.

Ưu nhược điểm

✔Có thể sao chép các object mà không cần couple với những class cụ thể của chúng.

✔Không cần lặp đi tái diễn mã khởi tạo

✔Bạn cũng có thể tạo các object phức tạp một cách thuận tiện hơn.

✔Là một giải pháp thay thế cho thừa kế khi phải xử lý các cấu hình thiết lập trước cấu hình cho những object phức tạp.

✖Sao chép các object phức tạp có phụ thuộc vòng có thể rất khó.

Quan hệ với những mẫu khác

  • Nhiều thiết kế khai mạc bằng phương pháp sử dụng Factory Method (ít phức tạp hơn và có thể tùy chỉnh nhiều hơn thông qua các class con) và phát triển theo phía Abstract Factory, Prototype hoặc Builder (linh hoạt hơn nhưng phức tạp hơn).

  • Các class Abstract Factory thường dựa trên một tập hợp các Abstract Factory, nhưng bạn cũng sẽ có thể sử dụng Prototype để soạn các phương thức trên các class này.

  • Prototype có thể hữu ích khi bạn cần phải lưu các bản sao của Command vào lịch sử hào hùng.

  • Các thiết kế sử dụng nhiều Composite và Decorator thường có thể được bổ trợ từ việc sử dụng Prototype. Ứng dụng mẫu được chấp nhận bạn sao chép các cấu trúc phức tạp thay vì xây dựng lại chúng từ trên đầu.

  • Prototype không dựa trên tính thừa kế, vì vậy nó không có nhược điểm của thừa kế. Mặt khác, Prototype yêu cầu khởi tạo object nhân văn phức tạp. Factory Method dựa trên thừa kế nhưng không yêu cầu bước khởi tạo.

  • Thỉnh thoảng Prototype có thể là một giải pháp thay thế đơn giản hơn cho Memento. Điều này hoạt động nếu object hoặc trạng thái mà bạn muốn lưu trữ trong lịch sử hào hùng khá đơn giản và không có liên kết đến tài nguyên phía bên ngoài hoặc các liên kết dễ thiết lập lại.

  • Abstract Factories, Builders và Prototypes đều phải có thể implement như Singleton.

You May Also Like

About the Author: v1000