一 概要
1.1 创建型模式
- 描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。
1.2 定义
- 是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
二 UML类图
三 例子
public interface IFactory
{
AbstractProductA CreateProductA();
AbstractProductB CreateProductB();
}
public abstract class AbstractProductA
{
}
public abstract class AbstractProductB
{
}
public class ProductAOne : AbstractProductA
{
}
public class ProductATwo : AbstractProductA
{
}
public class ProductBOne : AbstractProductB
{
}
public class ProductBTwo : AbstractProductB
{
}
public class FactoryOne : IFactory
{
public AbstractProductB CreateProductB()
{
return new ProductBOne();
}
public AbstractProductA CreateProductA()
{
return new ProductAOne();
}
}
public class FactoryTwo : IFactory
{
public AbstractProductB CreateProductB()
{
return new ProductBTwo();
}
public AbstractProductA CreateProductA()
{
return new ProductATwo();
}
}
public class Test
{
public Test()
{
IFactory factory = new FactoryOne();
factory.CreateProductB();
factory.CreateProductA();
}
}
四 优缺点
4.1 优点
- 便于交换产品系列, 客户端需要更改具体产品的时候只需要更换调用的具体工厂类。
- 让具体的产品创建实例过程与客户端分离,客户端通过调用他们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端代码中。
- 有利于产品的一致性。当一个系列的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要,而抽象工厂很容易实现这一点。
4.2 缺点
- 难以支持新种类的产品。因为抽象工厂接口确定了可以被创建的产品集合,所以难以扩展抽象工厂以生产新种类的产品。
五 使用场景
- 当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。
- 系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。
- 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。