I. Introduction:
Prototype Pattern is a Design Pattern of the Creational group. It allows us to copy an object regardless of the object ‘s class . Prototype Pattern consists of the following main components:
- Copyng Ptotocol : The protocol used to declare methods for copying objects .
- Prototye : is a class adopting Copying Protocol to serve for duplicating its objects .
II. How it works:
To copy an object of the class , the Prototype Pattern will use an initialization function with the input params as an attribute of the object to be copied . The values retrieved from the params passed into the constructor will be used to initialize a new object .
III. When is the prototype model used?
The prototype pattern is used when you want an object of the class to make a copy of itself.
IV. For example:
Declaring 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 in the 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> |
Use
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. References:
- Design Pattern by Tutorials – Raywenderlich
- State Pattern by refactoring.guru