1.工廠模式介紹
上一篇我們知道了簡單工廠的缺點是:當我們添加一個新的產品時需要修改工廠類,這樣就違背了開閉原則。工廠模式就是為了解決這一缺陷而出現的,解決的方法是把創建具體實例的任務放在了工廠的子類中,工廠只提供了創建實例的的接口,還以上一篇中的生產鼠標為例:
鼠標類:
//鼠標抽象類 public abstract class Mouse { public abstract void Print(); } //戴爾鼠標 public class DellMouse : Mouse { public override void Print() { Console.WriteLine("生產了一個Dell鼠標!"); } } //惠普鼠標 public class HpMouse : Mouse { public override void Print() { Console.WriteLine("生產了一個惠普鼠標!"); } }
工廠類只提供生產鼠標的抽象方法(或者接口),其子類生產具體的產品,如戴爾鼠標工廠繼承於鼠標工廠,它只生產戴爾鼠標;惠普鼠標工廠只生產惠普鼠標,代碼如下:
/// <summary> /// 鼠標工廠抽象類 /// </summary> public abstract class MouseFactory { public abstract Mouse CreateMouse(); } //戴爾鼠標工廠 public class DellMouseFactroy : MouseFactory { public override Mouse CreateMouse() { return new DellMouse();//在具體的工廠中實例化產品 } } //惠普鼠標工廠 public class HpMouseFactory : MouseFactory { public override Mouse CreateMouse() { return new HpMouse();//在具體的工廠中實例化產品 } }
客戶端代碼:
static void Main(string[] args) { //生產一個戴爾鼠標 MouseFactory dellMouseFactory = new DellMouseFactroy(); Mouse dellMouse= dellMouseFactory.CreateMouse(); dellMouse.Print(); //生產一個惠普鼠標 MouseFactory hpMouseFactory = new HpMouseFactory(); Mouse hpMouse = hpMouseFactory.CreateMouse(); hpMouse.Print(); Console.ReadKey(); }
運行程序,結果如下:
在上邊的例子我們可以看出:客戶端要生產一個具體產品時,首先要獲取這個產品對應的具體工廠實例,然后通過具體工廠來實例化產品。如果我們想生產華碩鼠標的話,要添加一個華碩鼠標工廠類(AsusMouseFactory)和華碩鼠標類(AsusMouse),然后在客戶端通過以下代碼來生產華碩鼠標:
MouseFactory asusMouseFactroy=new AsusMouseFactroy(); asusMouseFactory.CreateMouse();
通過工廠模式添加新產品是只有添加的操作,而不會去修改以前的代碼,符合開閉原則。
2.小結
上邊代碼的類圖:
工廠模式的優點:
工廠模式有效地解決了添加新產品必須要修改工廠類代碼的問題,符合設計原則中的開閉原則。
工廠模式的缺點:
工廠模式的本質是將具體實例的創建工作放在了具體子類工廠中進行,這造成一個新的問題:將選擇實例類型的任務交給了客戶端,如我們想生產一個戴爾鼠標,就必須在客戶端new一個戴爾鼠標工廠。想象下如果我們new了100個戴爾鼠標工廠,這是要換到惠普鼠標怎么辦?只能把new DellMouseFactory一個一個地替換成new HpMouseFactory。所以簡單工廠和工廠模式都不是完美的,我們應該根據具體的情況來選擇。