上一篇咱們知道了簡單工廠的缺點是:當咱們添加一個新的產品時須要修改工廠類,這樣就違背了開閉原則。工廠模式就是爲了解決這一缺陷而出現的,解決的方法是把建立具體實例的任務放在了工廠的子類中,工廠只提供了建立實例的的接口,還以上一篇中的生產鼠標爲例:ide
鼠標類:spa
//鼠標抽象類 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();//在具體的工廠中實例化產品 } }
客戶端代碼:code
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(); }
運行程序,結果以下:blog
在上邊的例子咱們能夠看出:客戶端要生產一個具體產品時,首先要獲取這個產品對應的具體工廠實例,而後經過具體工廠來實例化產品。若是咱們想生產華碩鼠標的話,要添加一個華碩鼠標工廠類(AsusMouseFactory)和華碩鼠標類(AsusMouse),而後在客戶端經過如下代碼來生產華碩鼠標:繼承
MouseFactory asusMouseFactroy=new AsusMouseFactroy(); asusMouseFactory.CreateMouse();
經過工廠模式添加新產品是隻有添加的操做,而不會去修改之前的代碼,符合開閉原則。接口
上邊代碼的類圖:string
工廠模式的優勢:產品
工廠模式有效地解決了添加新產品必需要修改工廠類代碼的問題,符合設計原則中的開閉原則。it
工廠模式的缺點:
工廠模式的本質是將具體實例的建立工做放在了具體子類工廠中進行,這形成一個新的問題:將選擇實例類型的任務交給了客戶端,如咱們想生產一個戴爾鼠標,就必須在客戶端new一個戴爾鼠標工廠。想象下若是咱們new了100個戴爾鼠標工廠,這是要換到惠普鼠標怎麼辦?只能把new DellMouseFactory一個一個地替換成new HpMouseFactory。因此簡單工廠和工廠模式都不是完美的,咱們應該根據具體的狀況來選擇。