抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個介面,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象。根據里氏替換原則,任何接受父類型的地方,都應當能夠接受子類型。 ...
抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個介面,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象。根據里氏替換原則,任何接受父類型的地方,都應當能夠接受子類型。
抽象工廠模式結構圖:
抽象工廠模式是所有形態的工廠模式中最為抽象和最具一般性的一種形態。抽象工廠模式是指當有多個抽象角色時,使用的一種工廠模式。抽象工廠模式可以向客戶端提供一個介面,使客戶端在不必指定產品的具體的情況下,創建多個產品族中的產品對象。
應用場景:一個生產集團,在北京的工廠需要生產A類汽車,A類電視;在上海的工廠需要生產B類汽車,A類電視。而在廣州的工廠需要生產C類汽車,C類電視。我們可以使用抽象工廠,抽象出工廠類,和產品類,然後繼承工廠類,生產所需要的具體產品類型,產品繼承抽象出來的產品,實現裡面的行為方法。
1.抽象出Car產品和TV產品
/// <summary> /// 抽象汽車產品 /// </summary> public abstract class Car { public abstract void Build(); }
/// <summary> /// 抽象TV產品 /// </summary> public abstract class TV { public abstract void work(); }
2.繼承自抽象出來的產品類,實現裡面的方法,成為具體產品:這裡只舉例Acar和TVA的,後面的Bcar,Ccar,TVB,TVC,類似。
public class CarA:Car { public override void Build() { Console.WriteLine("CarA"); } }
public class TVA : TV { public override void work() { Console.WriteLine("TVA"); } }
3.抽象出工廠類,裡面有待實現創建產品的方法
/// <summary> /// 抽象生產工廠 /// </summary> public abstract class AbstractFactory { /// <summary> /// 生產TV產品 /// </summary> /// <returns></returns> public abstract TV newTV(); /// <summary> /// 生產Car類產品 /// </summary> /// <returns></returns> public abstract Car newCar(); }
4.創建具體的工廠類,繼承自抽象出來的工廠,實現裡面創建具體產品的方法。例:後面的B工廠,和C工廠類似實現
/// <summary> /// A工廠 /// </summary> public class AbstractFactoryA:AbstractFactory { /// <summary> /// 生產A品牌電視 /// </summary> /// <returns></returns> public override TV newTV() { return new TVA(); } /// <summary> /// 生產A品牌汽車 /// </summary> /// <returns></returns> public override Car newCar() { return new CarA(); } }
/// <summary> /// B工廠生 /// </summary> public class AbstractFactoryB:AbstractFactory { /// <summary> /// 生產B品牌電視 /// </summary> /// <returns></returns> public override TV newTV() { return new TVB(); } /// <summary> /// 生產A品牌汽車 /// </summary> /// <returns></returns> public override Car newCar() { return new CarA(); } }
public class AbstractFactoryC:AbstractFactory { /// <summary> /// 生產C品牌電視 /// </summary> /// <returns></returns> public override TV newTV() { return new TVC(); } /// <summary> /// 生產C品牌汽車 /// </summary> /// <returns></returns> public override Car newCar() { return new CarC(); } }
5.調用,根據具體情況進行選擇,現在是在哪一個工廠,就創建該工廠
class Program { static void Main(string[] args) { AbstractFactory factorysubA = new AbstractFactoryA(); TV t = factorysubA.newTV(); Car c = factorysubA.newCar(); Console.WriteLine("A工廠生產:"); t.work(); c.Build(); AbstractFactory factorysubB = new AbstractFactoryB(); t = factorysubB.newTV(); c = factorysubB.newCar(); Console.WriteLine("B工廠生產:"); t.work(); c.Build(); AbstractFactory factorysunC = new AbstractFactoryC(); t = factorysunC.newTV(); c = factorysunC.newCar(); Console.WriteLine("C工廠生產:"); t.work(); c.Build(); Console.Read(); } }