繼上篇簡單工廠設計模式之后,今天繼續講解抽象工廠設計模式。在簡單工廠中,我們的工廠類一次只可以處理一類產品。那么如果我們想處理多類產品,簡單工廠是滿足不了的。必須要用抽象工廠設計模式。
我們先從概念上來了解下什么是抽象工廠設計模式:
•1、提供一系列相互依賴對象的創建工作
•2、封裝對象常規的創建方法(new)
•3、提供統一調用訪問方法的方式
•4、避免調用訪問方法和具體對象創建工作的緊耦合
這些概念性的東西看起來比較抽象,直接上圖
如上圖所示,我們如何去更好的理解抽象工廠,首先 我們要分清在這個模式中的幾類角色。有抽象工廠,實體工廠,抽象產品,實體產品,客戶(調用代碼的類)。
•抽象工廠設計模式中各個對象的主要功能、職責:
•1、用抽象工廠生產抽象產品
•2、用實體工廠生產實體產品
•3、用抽象產品提供實體產品訪問接口
•4、用實體產品實現自己的功能
直接上代碼:
1、定義抽象產品 (父類可以是接口或者抽象類,我們定義一個抽象類,一個接口)
定義抽象產品A:
/// <summary> /// 抽象產品A /// </summary> public abstract class Car { public abstract void Run(); }
抽象產品B:
/// <summary> /// 抽象產品B /// </summary> public interface IBus { void Run(); }
2、定義實體產品
實體產品A1:
/// <summary> /// 實體產品A1 /// </summary> public class BMWCar:Car { public override void Run() { Console.WriteLine("寶馬轎車在行駛!"); } }
實體產品A2:
/// <summary> /// 實體產品A2 /// </summary> public class BenzCar:Car { public override void Run() { Console.WriteLine("奔馳轎車在行駛!"); } }
實體產品B1:
/// <summary> /// 實體產品B1 /// </summary> public class BMWBus : IBus { public void Run() { Console.WriteLine("寶馬大汽車"); } }
實體產品B2:
/// <summary> /// 實體產品B2 /// </summary> public class BenzBus : IBus { public void Run() { Console.WriteLine("奔馳大汽車"); } }
我們甚至可以再建N個A3,A4,B3,B4.................... 此處省略。
3、定義抽象工廠
眾所周知現實生活中工廠都是生產產品的,在我們這 工廠是用來生產類的對象的。抽象工廠就是用來定義 工廠應該做什么的。相當於工廠接口規定工廠應該做什么。同時創建實體工廠對象,創建對象可以用反射,本例中只是為了說明抽象工廠的思想和具體實現。我們直接使用配置文件來讀取。
/// <summary> /// 抽象工廠 /// </summary> public abstract class AbstractFactory { public static AbstractFactory CreateFactory(string strType) { AbstractFactory factory = null; switch (strType) { case "BMW": factory = new BMWFactory(); break; case "Benz": factory = new BenzFactory(); break; } return factory; } /// <summary> /// 抽象方法 創建Car對象 /// </summary> /// <returns></returns> public abstract Car CreateCar(); /// <summary> /// 創建BUS /// </summary> /// <returns></returns> public abstract IBus CreateBus(); }
4、定義實體工廠
實體工廠1:
/// <summary> /// 實體工廠1 /// </summary> public class BMWFactory:AbstractFactory { public override Car CreateCar() { return new BMWCar(); } public override IBus CreateBus() { return new BMWBus(); } }
實體工廠2:
/// <summary> /// 實體工廠2 /// </summary> public class BenzFactory : AbstractFactory { public override Car CreateCar() { return new BenzCar(); } public override IBus CreateBus() { return new BenzBus(); } }
5、客戶端調用
從 最上面的圖我們可以看出客戶端調用抽象工廠的代碼只關注抽象工廠和抽象產品,而不關注具體的實現類。如下圖:
由此我們得出抽象工廠的定義:
提供一個創建一系列相關或相互依賴對象的接口,無需指定它們具體的類
static void Main(string[] args) { AbstractFactory factory = AbstractFactory.CreateFactory("Benz"); Car car = factory.CreateCar(); car.Run(); IBus bus = factory.CreateBus(); bus.Run(); }
直接上代碼: