【設計模式】——原型模式
阿新 • • 發佈:2019-01-04
【原型模式】
原型模式是用原型例項制定建立物件的種類,並且通過拷貝這些原型建立新的物件
這種模式是實現了一個原型介面,該介面用於建立當前物件的克隆。當直接建立物件的代價比較大時,則採用這種模式。
【介紹】
-
主要解決:在執行期建立和刪除原型
-
何時使用:1、當一個系統應該獨立於它的產品建立,構成和表示時;2、當要例項化的類是在執行時刻指定時,例如,通過動態裝載;3、為了避免建立一個於產品類層次平行的工廠類層次時;4、當一個類的例項只有被幾個不同狀態組合中的一種時,建立相應數目的原型並克隆它們可能比每次用合適的狀態手工例項化該類更方便一些
-
如何解決:利用已有的一個原型物件,快速地生成和原型物件一樣的例項
-
優點:效能高、逃避建構函式的約束
-
缺點:1、配備克隆方法需要對類的功能進行通盤考慮,對於全新類不是很難,但是對於已有的類不一定容易;2、必須實現Cloneable介面
-
注意事項:與通過一個類進行例項化來構造新物件不同的是,原型模式是通過拷貝一個現有物件的生成一個新的物件。淺拷貝實現cloneable,深拷貝是通過實現serializable讀取二進位制流。
【實現】
步驟一:原型類
abstract class Prototype { private string id; // Constructor public Prototype(string id) { this.id = id; } // Property public string Id { get { return id; } } public abstract Prototype Clone(); }
步驟二:具體原型類
class ConcretePrototype1 : Prototype { // Constructor public ConcretePrototype1(string id) : base(id) { } public override Prototype Clone() { // Shallow copy return (Prototype)this.MemberwiseClone(); } } class ConcretePrototype2 : Prototype { // Constructor public ConcretePrototype2(string id) : base(id) { } public override Prototype Clone() { // Shallow copy return (Prototype)this.MemberwiseClone(); } }
步驟三:客戶端程式碼
ConcretePrototype1 p1 = new ConcretePrototype1("I");
ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();
Console.WriteLine("Cloned: {0}", c1.Id);
ConcretePrototype2 p2 = new ConcretePrototype2("II");
ConcretePrototype2 c2 = (ConcretePrototype2)p2.Clone();
Console.WriteLine("Cloned: {0}", c2.Id);
// Wait for user
Console.Read();
【總結】