說明:
為避免了簡單工廠模式,對工廠類靜態方法的修改(對修改應該是封閉的)。
實作方式,將簡單工廠的工廠類靜態方法,再拆成不同的小子類。
註:其實我不了解,這跟略過工廠,直接 new 實作的 class,有什麼差別。可能是我沒遇到適合的情況,遇到時,可能就會頓悟 XD
範例:
生產玩具車、玩具狗。
希望達成如下的效果
static void Main(string[] args) { // 工廠方法模式寫法 ToyFactory xx; Toy aa; xx = new ToyCarFactory(); aa = xx.CreateToy(); aa.MakeToy();//製造了 玩具車 xx = new ToyDogFactory(); aa = xx.CreateToy(); aa.MakeToy();//製造了 玩具車 /* 比較:簡單工單模式寫法 Toy aa; aa = ToyFactory.CreateToy("car"); aa.MakeToy();//製造了 玩具車 aa = ToyFactory.CreateToy("dog"); aa.MakeToy();//製造了 玩具狗 */ Console.ReadLine(); }執行結果:
製造了 玩具車
製造了 玩具狗
實現重點在於,每個小工廠都有一個 CreateToy() 方法,能回傳同類型實際生產的物件。
其餘程式碼
abstract class Toy { public abstract void MakeToy(); } class ToyCar : Toy { public override void MakeToy() { Console.WriteLine("製造了 玩具車"); } } class ToyDog : Toy { public override void MakeToy() { Console.WriteLine("製造了 玩具狗"); } } // 工廠方法模式寫法 interface ToyFactory { Toy CreateToy(); } class ToyCarFactory : ToyFactory { public Toy CreateToy() { return new ToyCar(); } } class ToyDogFactory : ToyFactory { public Toy CreateToy() { return new ToyDog(); } } /* 比較:簡單工單模式寫法 class ToyFactory { public static Toy CreateToy(String cc) { Toy obj = null; switch (cc) { case "car": obj = new ToyCar(); break; case "dog": obj = new ToyDog(); break; default: throw new Exception("沒有這個類別"); } return obj; } } */
相關連結:設計模式整理列表
沒有留言:
張貼留言