定義與特點(diǎn)原型(Prototype)模式的定義如下:用一個(gè)已經(jīng)創(chuàng)建的實(shí)例作為原型,通過復(fù)制該原型對(duì)象來創(chuàng)建一個(gè)和原型相同或相似的新對(duì)象。 結(jié)構(gòu)與實(shí)現(xiàn)由于 C# 提供了 ICloneable 接口,,用 C# 實(shí)現(xiàn)原型模式很簡單。 模式的結(jié)構(gòu)原型模式包含以下主要角色:
使用接口作為Prototype時(shí),其結(jié)構(gòu)圖如圖所示(后面全部是接口方式的原型模式實(shí)現(xiàn)): 使用抽象類作為Prototype時(shí),,其結(jié)構(gòu)圖如圖所示(來自GOF): 模式的實(shí)現(xiàn)C# 中已經(jīng)定義了 ICloneable 接口,,具體原型類只要實(shí)現(xiàn) ICloneable 接口就可實(shí)現(xiàn)對(duì)象的克?。∣bject有 MemberwiseClone() 方法默認(rèn)淺克隆),,克隆是淺克隆還是深克隆取決于具體原型類 Clone() 的實(shí)現(xiàn),。其代碼如下: //原型接口:該接口不需要自己定義,C#中已經(jīng)定義好了 public interface ICloneable { Object Clone(); } //抽象原型類 public abstract class Prototype { public abstract Object Clone(); } //具體原型類(接口方式) public class ConcretePrototype : /*Prototype,*/ICloneable { private int id; public int Id { get { return id; } } public ConcretePrototype(int id) { this.id = id; } public Object Clone() { return new ConcretePrototype(id); } //使用抽象原型類 //public override Object Clone() //{ // //Object的默認(rèn)克隆方式(淺克?。? // return (Prototype)this.MemberwiseClone(); //} } //訪問類,,這里直接用的控制臺(tái)的Program類 class Program { static void Main(string[] args) { ConcretePrototype cp1 = new ConcretePrototype(1); ConcretePrototype cp2 = (ConcretePrototype)cp1.Clone(); Console.WriteLine("cp1的Id為:{0}",cp1.Id); Console.WriteLine("cp2的Id為:{0}", cp2.Id); Console.ReadKey(); } } 運(yùn)行結(jié)果: cp1的Id為:1 cp2的Id為:1 應(yīng)用場景原型模式通常適用于以下場景:
擴(kuò)展:帶原型管理器的原型模式原型模式可擴(kuò)展為帶原型管理器的原型模式,,它在原型模式的基礎(chǔ)上增加了一個(gè)原型管理器 PrototypeManager 類,。該類用 Dictionary(或HashMap) 保存多個(gè)復(fù)制的原型,Client 類可以通過管理器的 Get(String id) 方法從中獲取復(fù)制的原型,。其結(jié)構(gòu)如圖所示: |
|