定义
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
模式概述
抽象工厂模式是所有形式的工厂模式中最为抽象和最具一般性的一种形式,该模式与工厂方法模式的区别在于:工厂方法模式针对的是一个产品等级结构,而抽象工厂模式需要面对多个产品等级结构,即抽象工厂模式创建的并不是一个简单的对象,而是可以创建出多个位于不同产品等级、属于不同类型的具体产品对象。
产品等级结构和产品族
产品等级结构:表示产品的继承结构,如一个抽象类是狗,子类包括哈士奇、牧羊犬等等,抽象类与具体的子类便构成了一个产品等级结构。
产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的产品,位于不同产品等级结构中的一组产品。如动物中的哈士奇和海东青,哈士奇属于狗的产品等级结构中,海东青属于老鹰的产品等级结构中,哈士奇和海东青便构成了一个产品族(动物)。
抽象工厂模式的结构
- AbstractFactory(抽象工厂):声明了一组用于创建产品族的方法,其中每一个方法对应一个产品。
- Factory(具体工厂):继承自抽象工厂,实现了抽象工厂中声明的创建产品的方法。
- AbstractProduct(抽象产品):为每中产品声明接口,具体产品的基类。
- Product(具体产品):具体产品对象,实现了抽象产品中声明的业务方法。
抽象工厂模式的实现
- 抽象产品类
abstract class AbstractProductA
{
public void SameMethod()
{
//所有产品的公共方法
Console.WriteLine("所有产品A的公共方法");
}
//差异化行为
public abstract void DiffMethod();
}
abstract class AbstractProductB
{
public void SameMethod()
{
//所有产品的公共方法
Console.WriteLine("所有产品B的公共方法");
}
//差异化行为
public abstract void DiffMethod();
}
- 具体产品类
//产品A1
class ProductA1 : AbstractProductA
{
public override void DiffMethod()
{
//这里实现产品A1的业务逻辑
Console.WriteLine("这里实现产品A的业务逻辑");
}
}
//产品B1
class ProductB1 : AbstractProductB
{
public override void DiffMethod()
{
//这里实现产品B1的业务逻辑
Console.WriteLine("这里实现产品B的业务逻辑");
}
}
- 抽象工厂类
abstract class AbstractFactory
{
public abstract AbstractProductA CreateProductA();
public abstract AbstractProductB CreateProductB();
}
- 具体工厂类
class ConcreteFactory : AbstractFactory
{
public override AbstractProductA CreateProductA()
{
return new ProductA1();
}
public override AbstractProductB CreateProductB()
{
return new ProductB1();
}
}
- 使用
var factory = new ConcreteFactory();
var productA = factory.CreateProductA();
productA.SameMethod();
productA.DiffMethod();
var productB = factory.CreateProductB();
productB.SameMethod();
productB.DiffMethod();
- 结果
开闭原则倾斜性
如果在使用抽象工厂模式的过程中考虑不全面,在设计的时候遗漏了产品族中的某一产品,导致后续需求变动出现新的产品时,需要修改抽象工厂类,以添加对新产品的创建接口,同时还要修改具体的工厂类,否则无法将新产品应用于系统中。
在抽象工厂模式中,增加新的产品族非常方便,但是要给已有产品族增加新的产品却很麻烦,抽象工厂模式的这种特性便是开闭原则倾斜性。
对于抽象工厂模式来说,其功能增强包括:
- 增加产品族:对此,抽象工厂模式可以很好的支持,并满足开闭原则,只需增加具体产品族对应增加一个新的工厂即可。
- 现有产品族中增加新的产品:需要修改所有的工厂角色,以增加创建新产品的方法,违背了开闭原则。
抽象工厂模式以一种倾斜的方式满足开闭原则,因此在使用时要慎重考虑,避免出现在设计完之后增加或删除产品族中的产品,会导致系统出现较大的改动。
抽象工厂模式的优点
- 当一个产品族中的多个对象被设计成一起工作时,可以保证使用的是同一产品族的对象。
- 增加新的产品族很方便,符合开闭原则。
抽象工厂模式的缺点
增加新的产品等级结构很麻烦,违背开闭原则。
什么时候考虑使用抽象工厂模式?
- 系统中存在一个以上的产品族,但每次只使用其中某一族的产品进行工作。
- 产品等级结构稳定,设计完成后不会添加新的产品等级结构或者删除已有的产品等级结构。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。