談談設計模式~原型模式(Prototype)

weixin_34391854發表於2014-08-08

返回目錄

原型模式是建立型模式的一種,其特點在於通過“複製”一個已經存在的例項來返回新的例項(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();

結果截圖

 

返回目錄

相關文章