I. Giới thiệu:
Prototype Pattern là một Design Pattern thuộc nhóm Creational. Nó cho phép chúng ta có thể copy một object mà không phụ thuộc vào class của của object đó. Prototype Pattern gồm các thành phần chính như sau:
- Copyng Ptotocol: là protocol được sử dụng để khai báo các phương thức phục vụ cho việc copy object.
- Prototye: là class adopt Copying Protocol để phục vụ cho việc nhân bản các object của nó.
II. Cách thức hoạt động:
Để copy một object của class, Prototype Pattern sẽ sử dụng một hàm khởi tạo với params đầu vào là thuộc tính của object cần copy. Các giá trị lấy ra được từ params truyền vào trong hàm khởi tạo sẽ được sử dụng để khởi tạo một object mới.
III. Prototype Pattern được sử dụng khi nào?
Prototype Pattern được sử dụng khi muốn một object của class có thể tạo ra một bản sao copy từ chính nó.
IV. Ví dụ:
Khai báo Copying Protocol
1 2 3 4 5 |
<span class="token keyword">protocol</span> <span class="token builtin">Copying</span><span class="token punctuation">:</span> <span class="token keyword">class</span> <span class="token punctuation">{</span> <span class="token keyword">func</span> <span class="token function">copy</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token keyword">Self</span> <span class="token punctuation">}</span> |
Implement Copying Ptotocol trong Prototype object.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span class="token keyword">class</span> <span class="token class-name">Monster</span><span class="token punctuation">:</span> <span class="token builtin">Copying</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token keyword">var</span> health<span class="token punctuation">:</span> <span class="token builtin">Int</span> <span class="token keyword">public</span> <span class="token keyword">var</span> level<span class="token punctuation">:</span> <span class="token builtin">Int</span> <span class="token keyword">public</span> <span class="token keyword">init</span><span class="token punctuation">(</span>health<span class="token punctuation">:</span> <span class="token builtin">Int</span><span class="token punctuation">,</span> level<span class="token punctuation">:</span> <span class="token builtin">Int</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">self</span><span class="token punctuation">.</span>health <span class="token operator">=</span> health <span class="token keyword">self</span><span class="token punctuation">.</span>level <span class="token operator">=</span> level <span class="token punctuation">}</span> <span class="token keyword">func</span> <span class="token function">copy</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">></span> <span class="token builtin">Monster</span> <span class="token punctuation">{</span> <span class="token keyword">let</span> newMonster <span class="token operator">=</span> <span class="token function">Monster</span><span class="token punctuation">(</span>health<span class="token punctuation">:</span> <span class="token keyword">self</span><span class="token punctuation">.</span>health<span class="token punctuation">,</span> level<span class="token punctuation">:</span> <span class="token keyword">self</span><span class="token punctuation">.</span>level<span class="token punctuation">)</span> <span class="token keyword">return</span> newMonster <span class="token punctuation">}</span> <span class="token punctuation">}</span> |
Sử dụng
1 2 3 |
<span class="token keyword">let</span> monster <span class="token operator">=</span> <span class="token function">Monster</span><span class="token punctuation">(</span>health<span class="token punctuation">:</span> <span class="token number">700</span><span class="token punctuation">,</span> level<span class="token punctuation">:</span> <span class="token number">37</span><span class="token punctuation">)</span> <span class="token keyword">let</span> monster2 <span class="token operator">=</span> monster<span class="token punctuation">.</span><span class="token function">copy</span><span class="token punctuation">(</span><span class="token punctuation">)</span> |
V. Tài liệu tham khảo:
- Design Pattern by Tutorials – Raywenderlich
- State Pattern by refactoring.guru