定义
提供一个创立一系列相干或相互依赖对象的接口,而无需指定它们具体的类。
模式概述
形象工厂模式是所有模式的工厂模式中最为形象和最具一般性的一种模式,该模式与工厂办法模式的区别在于:工厂办法模式针对的是一个产品等级构造,而形象工厂模式须要面对多个产品等级构造,即形象工厂模式创立的并不是一个简略的对象,而是能够创立出多个位于不同产品等级、属于不同类型的具体产品对象。
产品等级构造和产品族
产品等级构造 :示意产品的继承构造,如一个抽象类是狗,子类包含哈士奇、牧羊犬等等,抽象类与具体的子类便形成了一个产品等级构造。
产品族: 在形象工厂模式中,产品族是指由同一个工厂生产的产品,位于不同产品等级构造中的一组产品。如动物中的哈士奇和海东青,哈士奇属于狗的产品等级构造中,海东青属于老鹰的产品等级构造中,哈士奇和海东青便形成了一个产品族 (动物)。
形象工厂模式的构造
- 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();
- 后果
开闭准则歪斜性
如果在应用形象工厂模式的过程中思考不全面,在设计的时候脱漏了产品族中的某一产品,导致后续需要变动呈现新的产品时,须要批改形象工厂类,以增加对新产品的创立接口,同时还要批改具体的工厂类,否则无奈将新产品利用于零碎中。
在形象工厂模式中,减少新的产品族十分不便,然而要给已有产品族减少新的产品却很麻烦,形象工厂模式的这种个性便是开闭准则歪斜性。
对于形象工厂模式来说,其性能加强包含:
- 减少产品族:对此,形象工厂模式能够很好的反对,并满足开闭准则,只需减少具体产品族对应减少一个新的工厂即可。
- 现有产品族中减少新的产品:须要批改所有的工厂角色,以减少创立新产品的办法,违反了开闭准则。
形象工厂模式以一种歪斜的形式满足开闭准则,因而在应用时要慎重考虑,避免出现在设计完之后减少或删除产品族中的产品,会导致系统呈现较大的改变。
形象工厂模式的长处
- 当一个产品族中的多个对象被设计成一起工作时,能够保障应用的是同一产品族的对象。
- 减少新的产品族很不便,合乎开闭准则。
形象工厂模式的毛病
减少新的产品等级构造很麻烦,违反开闭准则。
什么时候思考应用形象工厂模式?
- 零碎中存在一个以上的产品族,但每次只应用其中某一族的产品进行工作。
- 产品等级构造稳固,设计实现后不会增加新的产品等级构造或者删除已有的产品等级构造。