出處:https://www.cnblogs.com/wyy1234/
閱讀目錄
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("生產了一個惠普鼠標!"); } } //鍵盤抽象類 public abstract class Keybo { public abstract void Print(); } //戴爾鍵盤類 public class DellKeybo : Keybo { public override void Print() { Console.WriteLine("生產了一個戴爾鍵盤!"); } } //惠普鍵盤 public class HpKeybo : Keybo { public override void Print() { Console.WriteLine("生產了一個惠普鍵盤!"); } }
工廠類, 抽象工廠類提供了生產鼠標和生產鍵盤的抽象方法,戴爾工廠繼承了抽象工廠,實現抽象方法時只創建自己品牌的鼠標和鍵盤;惠普工廠同理,代碼如下:
/// <summary> /// Pc產品工廠抽象類 /// </summary> public abstract class PcFactory { public abstract Mouse CreateMouse(); public abstract Keybo CreateKeybo(); } //戴爾pc工廠 public class DellPcFactroy : PcFactory { public override Keybo CreateKeybo() { return new DellKeybo(); } public override Mouse CreateMouse() { return new DellMouse(); } } //惠普pc工廠 public class HpPcFactory : PcFactory { public override Mouse CreateMouse() { return new HpMouse(); } public override Keybo CreateKeybo() { return new HpKeybo(); } }
客戶端代碼:
class Program { static void Main(string[] args) { //生產一個戴爾鼠標/鍵盤 PcFactory dellFactory = new DellPcFactroy(); Mouse dellMouse= dellFactory.CreateMouse(); Keybo dellKeybo = dellFactory.CreateKeybo(); dellMouse.Print(); dellKeybo.Print(); //生產一個惠普鼠標/鍵盤 PcFactory hpFactory = new HpPcFactory(); Mouse hpMouse = hpFactory.CreateMouse(); Keybo hpKeybo = hpFactory.CreateKeybo(); hpMouse.Print(); hpKeybo.Print(); Console.ReadKey(); } }
程序運行結果如下:
我們可以看出抽象工廠和工廠模式的區別在於:抽象工廠可以生產多種產品(兩種:鼠標和鍵盤),而工廠模式只生產一種產品(鍵盤),抽象工廠主要時解決生產系列產品的問題。思考一下:如果抽象工廠中只有一種產品是什么情況呢?只有一種產品的抽象工廠其實就是工廠模式,我們可以把工廠模式看作是抽象工廠的一個特例。
2.小結
上邊例子的類圖:
抽象工廠的優點:抽象工廠具有工廠模式的優點,對添加系列產品符合閉合原則(工廠模式的系列產品只有一種)。如要生產華碩的鼠標和鍵盤,只需要添加一個AsusPcFactory(繼承與PcFactory),AsusMouse(繼承Mouse),AsusKeybo(繼承Keybo),就可以在客戶端通過以下代碼生產華碩鼠標和鍵盤:
PcFactory asusPcFactory=new AsusPcFactory(); asusPcFactory.CreateMouse();//生產華碩鼠標 asusPcFactory.CreaetKeybo();//生產華碩鍵盤
抽象模式的缺點:抽象模式對添加新產品不符合開閉原則。如要生產顯示器,不僅要添加顯示器抽象類和顯示器具體類,還需要修改PcFactory,在抽象工廠中添加一個CreateDisplay抽象方法(或接口),戴爾工廠和惠普工廠也要實現新增的抽象方法(或者接口)。