原型模式是建立型模式的一種,其特點在於通過“複製”一個已經存在的例項來返回新的例項(clone),而不是新建(new)例項。被複制的例項就是我們所稱的“原型”,這個原型是可定製的。
原型模式多用於建立複雜的或者耗時的例項,因為這種情況下,複製一個已經存在的例項使程式執行更高效;或者建立值相等,只是命名不一樣的同類資料。
從原型模式的概念中,我們可以看到,在這個模式裡,拷貝是個很重要的概念,即在不建立物件的情況下,返回一個已有物件,這就是拷貝去實現的,在物件導向的程式設計世界裡,拷貝分為淺拷貝和深拷貝,如果希望對兩者有更深入的認識,
可以閱讀我的這篇文章《不忘本~淺拷貝和深拷貝》。
何時能用到它?
當你一個大物件被建立後,它可以在程式裡被使用多次,而使用的時候可能有些屬性值會發生變化,這裡,你不需要重新去new這個物件,而可以使用原型模式去克隆這個物件,這樣,可以提交程式的效能。
策略模式的結構圖
策略模式實現說明
CarPrototype:抽象原型,定義一個克隆的方法,返回規定的原型
ConcteteCarPrototype:具體原型,實現了抽象原來的克隆,並返回了這類抽象原型,在具體原型中,還提供了某體的屬性和方法等
CarManagerL:原型管理器,這個管理員用於被前臺(UI)去呼叫,它用來儲存原型集合
策略模式的C#實現
#region 原型模式 abstract class CarPrototype { public abstract CarPrototype Clone(); } class ConcteteCarPrototype : CarPrototype { private string _body, _color, _wheal; public ConcteteCarPrototype(string body, string color, string wheal) { this._body = body; this._color = color; this._wheal = wheal; } public override CarPrototype Clone() { //實現淺表拷貝 return (CarPrototype)this.MemberwiseClone(); } public void Display(string _carName) { Console.WriteLine("{0}'s Cart Values are: {1},{2},{3}", _carName, _body, _color, _wheal); } } class CarManager { Hashtable colors = new Hashtable(); public CarPrototype this[string name] { get { return (CarPrototype)colors[name]; } set { colors.Add(name, value); } } } #endregion
呼叫程式碼
CarManager colormanager = new CarManager(); //初始化 colormanager["奧迪"] = new ConcteteCarPrototype("德國", "黑色", "四輪驅動"); colormanager["奇端"] = new ConcteteCarPrototype("中國", "白色", "前輪驅動"); //呼叫 ConcteteCarPrototype c1 = (ConcteteCarPrototype)colormanager["奇端"].Clone(); c1.Display("奇端"); Console.ReadLine();
結果截圖