C#設計模式——抽象工廠模式
阿新 • • 發佈:2020-11-04
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抽象方法(或介面),戴爾工廠和惠普工廠也要實現新增的抽象方法(或者介面)。