原型模式-Prototype Pattern

設計模式系列

定義:用原型的實例來指定創建的對象種類,並通過複製這些原型創造新的對象

啥咪???...你工啥咪挖溝,哇聽某啦...


簡單來說....圍繞的點就是"複製",這個複製是原型模式的精隨

那我們進一步解說為什麼要用原型模式...使用原型模式是在於能夠創造對象
使用原型模式的時機:

1.有時候對象類型一開始沒辦法確定,在這類型在執行的時候確認,使用Clone出
    一個對象比較容易些
2.某些情境,我們需要對象當中的副本,使用原型模式是最佳的狀況

那上述各位就會有一個疑問了???    那為什麼不用new 一個對象勒???
A:因為 new 一個對象時候...其一不能獲取目前對象的狀態,其二就算複製目前的對象
      效率不如原型模式,其三在使用原型模式的時候,將原來的對象複製一個出來,這
      個對象就跟目前的對象是完全一致了。

廢話不多說,來DEMO一下原型模式範例
 

    class Program
    {
        static void Main(string[] args)
        {
            ConcretePrototype1 p1 = new ConcretePrototype1("I");
            ConcretePrototype1 c1 = (ConcretePrototype1) p1.Clone();
            Console.WriteLine($"Cloned:{c1.Id}");
            ConcretePrototype2 p2 = new ConcretePrototype2("II");
            ConcretePrototype2 c2 = (ConcretePrototype2) p2.Clone();
            Console.WriteLine($"Cloned:{c2.Id}");
            Console.ReadKey();
        }
    }

    abstract class Prototype
    {
        private readonly string _id;

        protected Prototype(string id)
        {
            _id = id;
        }

        public string Id
        {
            get { return _id; }
        }

        public abstract Prototype Clone();
    }

    class ConcretePrototype1:Prototype
    {
        public ConcretePrototype1(string id) : base(id)
        {
        }

        public override Prototype Clone()
        {
            return (Prototype) this.MemberwiseClone();
        }
    }
    class ConcretePrototype2:Prototype
    {
        public ConcretePrototype2(string id) : base(id)
        {
        }

        public override Prototype Clone()
        {
            return (Prototype) this.MemberwiseClone();
        }
    }


優點:
1.效能不錯,比直接NEW一個物件好多,尤其是產生大量物件的時候,就可以體現出優點...
2.原型模式簡單化創造結構
缺點:
1.每個類別都要配置一個Clone Method...
2.搭配Clone Method的對應功能必須通盤考慮,對全新類別不太難,對既有類別不容易,
   且容易違反OCP原則...
 

老E隨手寫