接上篇簡單工廠模式進行改進。 由於簡單工廠模式違背開-閉原則,彈性太弱,例如增加一種鳥類,會造成修改類(工廠類) 好的實現應該是增加一種鳥類不影響現有類的修改。 思路: 在簡單工廠的基礎上我們增加一個抽象類(基礎抽象類),並且在基礎抽象工廠類中必須要定義一個抽象方法用來獲取所有鳥類的抽象基類,然後使 ...
接上篇簡單工廠模式進行改進。
由於簡單工廠模式違背開-閉原則,彈性太弱,例如增加一種鳥類,會造成修改類(工廠類)
好的實現應該是增加一種鳥類不影響現有類的修改。
思路:
在簡單工廠的基礎上我們增加一個抽象類(基礎抽象類),並且在基礎抽象工廠類中必須要定義一個抽象方法用來獲取所有鳥類的抽象基類,然後使其被其他各鳥類的工廠類繼承,這樣實現之後,客戶端實例華某鳥類的工廠賦給基礎抽象工廠類,用基礎抽象工廠類間接獲取到實例華對象。
實現代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AbstractFactory { /// <summary> /// 定義工廠的介面規範所有不同類型的工廠類 /// </summary> /// <summary> /// 所有鳥類的抽象基類 /// </summary> public abstract class Bird { public virtual void Feather() { Console.Write("我有羽毛了\r\n"); } public abstract void Wing(); } /// <summary> /// 老鷹 /// </summary> class Eagle : Bird { public override void Wing() { Console.Write("我是老鷹我的翅膀很寬闊!\r\n"); } } /// <summary> /// 鴕鳥 /// </summary> public class Ostrich : Bird { public override void Wing() { Console.Write("我是駝鳥有翅膀也不能飛!\r\n"); } } /// <summary> /// 麻雀 /// </summary> class Sparrow : Bird { public override void Feather() { Console.Write("我是麻雀我的羽毛是麻色的!\r\n"); } public override void Wing() { Console.Write("我是麻雀,我是zhizhiz的飛!\r\n"); } public void Eat() { Console.Write("我是麻雀,我能吃!\r\n"); } } //**********************************基礎工廠類 public abstract class Factory { public abstract Bird GetBird(); } //**********************************其他工廠類 /// <summary> /// 老鷹工廠 /// </summary> public class EagleFactory : Factory { public override Bird GetBird() { return new Eagle(); } } /// <summary> /// 鴕鳥工廠 /// </summary> public class OstrichFactory : Factory { public override Bird GetBird() { return new Ostrich(); } } /// <summary> /// 麻雀工廠 /// </summary> public class SparrowFactory : Factory { public override Bird GetBird() { return new Sparrow(); } } }
客戶端:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace AbstractFactory { class Program { static void Main(string[] args) { Console.WriteLine("輸入要生成鳥--------Eagle Ostrich Sparrow"); Factory factory; Bird instance; //首先要實例化一個麻雀工廠賦給基礎工廠 factory = new SparrowFactory(); //通過基礎工廠獲得麻雀對象 instance = factory.GetBird(); var sparrow = instance as Sparrow;//as不僅可以當類型轉換也可以充當類型判斷 if (sparrow != null)//如果是麻雀,執行麻雀特有的Eat方法, { sparrow.Eat(); } instance.Feather(); instance.Wing(); //首先要實例化一個老鷹工廠賦給基礎工廠 factory = new EagleFactory(); //通過基礎工廠獲得老鷹對象 instance = factory.GetBird(); instance.Feather(); instance.Wing(); Console.ReadLine(); } } }
效果: