Khái niệm:
Xác định loại của các đối tượng để tạo ra bằng cách sử dụng một đối
tượng kiểu mẫu và tạo ra các đối tượng mới bằng việc sao chép kiểu mẫu
này.
Mức độ sử dụng: vừa.
UML Class Diagram:
Những lớp và/hoặc đối tượng trong mẫu này:
- Prototype (ColorPrototype): khai báo một đối tượng cho việc sao chép của nó.
- ConcretePrototype (Color): thực thi một hoạt động cho việc sao chép của nó.
- Client (ColorManager): tạo ra một đối tượng mới bằng việc yêu cầu một kiểu mẫu để sao chép của nó.
Prototype: khi nao sử dụng và sử dụng ở đâu
Giống như những mẫu thiết kế tạo lập khác (Builder, Abstract Factory
và Factory Method), mẫu thiết kế Prototype ẩn việc tạo đối tượng từ
client. Tuy nhiên, thay cho việc tạo ra một đối tượng không được thiết
lập, nó trả về một đối tượng mới đã được thiết lập với các giá trị mà nó
đã sao chép từ một đối tượng kiểu mẫu. Mẫu thiết kế Prototype không
được sử dụng phổ biến trong việc xây dựng các ứng dụng nghiệp vụ
(business application). Nó thường được sử dụng trong các kiểu ứng dụng
xác định như đồ họa máy tính, CAD (Computer Assisted Drawing), GIS
(Geographic Information Systems) và các trò chơi.
Mẫu thiết kế Prototype tạo ra các bản sao của các đối tượng mẫu tồn
tại trước đó. Cách tốt nhất để thực hiện việc này trong .NET là sử dụng
iCloneable interface có sẵn trên các đối tượng được dùng như các kiểu
mẫu. ICloneable interface có một phương thức gọi là Clone trả về một đối
tượng là một bản sao của đối tượng gốc.
Khi thực hiện chức năng Clone, bạn cần chú ý đến 2 kiểu khác nhau
sau: deep copy và shallow copy. Shallow copy thì dễ dàng hơn nhưng chỉ
sao chép các trường dữ liệu trong bản thân đối tượng – không phải các
đối tượng mà kiểu mẫu đưa ra. Deep copy sao chép đối tượng kiểu mẫu và
tất cả đối tượng nó đưa ra. Shallow copy thì dễ thực thi vì lớp Object
có một phương thức MemberwiseClone trả về một shallow copy của đối
tượng. Chiến lược sao chép cho deep copy có thể phức tạp hơn – một số
đối tượng không được sao chép dễ dàng (chẳng hạn như Threads, các kết
nối cơ sở dữ liệu,…).
Demo:
0 comments:
Post a Comment