模式定义
抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
与工厂模式区别:抽象工厂模式中的工厂类负责创建多种相关产品,工厂模式中的工厂类只负责创建一种产品。
关联定义
产品等级结构 继承于同一抽象类的产品
例如:一个抽象类型是电视机,其子类有海尔电视机、海信电视机、TCL电视机
则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,
抽象电视机是父类,而具体品牌的电视机是其子类。
产品族 由同一工厂类生产的产品
如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,
海尔电冰箱位于电冰箱产品等级结构中。
UML类图
• AbstractFactory:抽象工厂 生成各种产品的接口
• ConcreteFactory:具体工厂 实现了抽象工厂接口,生成的产品构成了一个产品族,每一个产品都位于某个产品等级结构中
• AbstractProduct:抽象产品 产品的抽象业务方法
• Product:具体产品 具体工厂生产的具体产品对象,实现抽象产品接口中定义的业务方法。
代码结构
public static class AbstractFactoryAPP
{
public static void Run()
{
AbstractFactory factory1 = new ConcreteFactory1();
AbstractProductA productA1 = factory1.CreateProductA();
AbstractProductB productB1 = factory1.CreateProductB();
productB1.Interact(productA1);
}
}
public abstract class AbstractProductA
{ }
public class ProductA1 : AbstractProductA
{ }
public class ProductA2 : AbstractProductA
{ }
public abstract class AbstractProductB
{
public abstract void Interact(AbstractProductA a);
}
public class ProductB1 : AbstractProductB
{
public override void Interact(AbstractProductA a)
{
Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name);
}
}
public class ProductB2 : AbstractProductB
{
public override void Interact(AbstractProductA a)
{
Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name);
}
}
public abstract class AbstractFactory
{
public abstract AbstractProductA CreateProductA();
public abstract AbstractProductB CreateProductB();
}
public class ConcreteFactory1:AbstractFactory
{
public override AbstractProductA CreateProductA()
{
return new ProductA1();
}
public override AbstractProductB CreateProductB()
{
return new ProductB1();
}
}
public class ConcreteFactory2 : AbstractFactory
{
public override AbstractProductA CreateProductA()
{
return new ProductA2();
}
public override AbstractProductB CreateProductB()
{
return new ProductB2();
}
}
情景案例
现在好多公司都在做自己的生态圈,好像只要利润的产品都生产(比如做手机的非要造汽车)。本例子举海尔与美的两家电器商,海尔与美的都生产冰箱与空调。冰箱、空调为抽象产品,海尔、美的为两个具体工厂。
public static class AbstractFactoryAPP
{
public static void Run()
{
Company haier = new HaierCompany();
AirConditioner productA1 = haier.CreateProductA();
Refrigerator productB1 = haier.CreateProductB();
productB1.Interact(productA1);
}
}
public abstract class AirConditioner
{ }
public class HaierAir : AirConditioner
{ }
public class MideaAir : AirConditioner
{ }
public abstract class Refrigerator
{
public abstract void Interact(AirConditioner a);
}
public class HaierRefrigerator : Refrigerator
{
public override void Interact(AirConditioner a)
{
Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name);
}
}
public class MideaRefrigerator : Refrigerator
{
public override void Interact(AirConditioner a)
{
Console.WriteLine(this.GetType().Name + " interacts with " + a.GetType().Name);
}
}
public abstract class Company
{
public abstract AirConditioner CreateProductA();
public abstract Refrigerator CreateProductB();
}
public class HaierCompany : Company
{
public override AirConditioner CreateProductA()
{
return new HaierAir();
}
public override Refrigerator CreateProductB()
{
return new HaierRefrigerator();
}
}
public class MediaCompany : Company
{
public override AirConditioner CreateProductA()
{
return new MideaAir();
}
public override Refrigerator CreateProductB()
{
return new MideaRefrigerator();
}
}