原型模式 - Prototype Pattern
用途
通過複製(Clone)一個已經存在的實例來返回新的實例,而不是新建(new)實例。
被複製的實例就是我們所稱的「原型」,這個原型是可定製的。
classDiagram
IPrototype <.. Client
IPrototype <|-- ConcretePrototype1
IPrototype <|-- ConcretePrototype2
note for Client "use Clone Generate Prototype"
class Client{
+Operation()
}
class IPrototype{
<<interface>>
+IPrototype Clone()
+Play()
}
class ConcretePrototype1{
+IPrototype Clone()
+Play()
}
class ConcretePrototype2{
+IPrototype Clone()
+Play()
}
例子
當談到原型模式(Prototype Pattern),我們可以想像一個製作玩具的工廠。
假設我們有一個玩具原型,例如一隻小熊玩偶,
我們可以使用該原型來製造多個相同的玩具,而無需從頭開始設計和建造每一個。
在這個例子中,原型模式的角色如下:
原型(Prototype):
這是玩具的原型,例如小熊玩偶。
它定義了一個方法,可以複製自己來創建新的實例。
具體原型(Concrete Prototype):
這是原型的具體實現,即實際的小熊玩偶。
它實現了複製自己的方法,以便能夠創建相同的實例。
客戶端(Client):
這是使用原型模式的程式碼,負責創建和使用玩具的實例。
它向原型發送複製的請求,並使用複製的實例進行操作,而不是直接創建新的實例。
Prototype Interface
1
2
3
4
5
6
// 定義原型介面
public interface IToyPrototype
{
IToyPrototype Clone();
void Play();
}
Concrete Prototype
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 定義原型介面
public class BearToy : IToyPrototype
{
public IToyPrototype Clone()
{
// 使用淺層複製,即創建一個新實例並複製成員的值
return (IToyPrototype)MemberwiseClone();
}
public void Play()
{
Console.WriteLine("Playing with a bear toy!");
}
}
Client
1
2
3
4
5
6
7
8
9
10
11
12
// 創建玩具原型
using PrototypePattern.Toy;
IToyPrototype bearToyPrototype = new BearToy();
// 使用原型創建新的玩具實例
IToyPrototype toy1 = bearToyPrototype.Clone();
IToyPrototype toy2 = bearToyPrototype.Clone();
// 操作玩具實例
toy1.Play();
toy2.Play();
延伸
C# ICloneable 介面
本文章以 CC BY 4.0 授權