意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
----《设计模式》GOF
适用性
- 当一个类不知道它所必须创建的对象的类的时候
- 当一个类希望由它的子类来指定它所创建的对象时
- 当类创建对象的职责委托给多个帮助的子类中的某一个,并且你希望帮助哪一个帮助子类是代理者这一信息局部化的时候
结构
参与者
-
Product
-
定义工厂方法所创建的对象的接口
- ConcreteProduct
- 实现Product接口
- Creator
- 声明工厂方法,该方法返回一个Product类型的对象。Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct队象
- 可以调用工厂方法以创建一个Product对象
- ConcreteCreator
- 重定义工厂方法以返回一个ConcreteProduct实例
协作
- Creator依赖它的子类来定义工厂方法,所以它返回一个恰当的ConcreteProduct实例
效果
- 为子类提供挂钩(Hook)
- 连接平行的类层次
实现
- 主要由两种不同的情况:(1)第一种情况是,Creator类是一个抽象类并且不提供所声明的工厂方法的实现。(2)第二种情况是,Creator是一个具体的类而且为工厂方法提供一个缺省的实现,也有可能有一个定义了缺省实现的抽象类,但这不太常见。第一种情况需要子类来定义实现,因为没有合理的缺省实现。它避免了不得不实例化不可预见类的问题。第二种情况,具体的Creator主要是因为灵活性才使用工厂方法,它所遵循的准则是,“用一个独立的操作创建对象,这样才能重定义它们的创建方式。”这条准则保证了子类的设计这能够在必要的时候改变父类所实例化的对象的类。
- 参数化工厂方法:该模式另一种情况使得工厂方法可以创建多种产品。工厂方法采用一个标识要被创建的对象种类的参数。
- 特定的语言的变化和问题
- 使用模板以避免创建子类
- 命名约定
代码示例
class FactoryStructure
{
public FactoryStructure()
{
Creator c = new ConcreteCreator();
Product p = c.FactoryMethod();
p.Test();
}
}
abstract class Creator
{
public abstract Product FactoryMethod() ;
public void Operation()
{ }
}
class ConcreteCreator:Creator
{
public override Product FactoryMethod()
{
return new ConcreteProduct();
}
}
abstract class Product
{
public abstract void Test();
}
class ConcreteProduct : Product
{
public override void Test()
{
Console.WriteLine("type:"+this.GetType().Name);
}
}
结果:
type:ConcreteProduct
如有问题,欢迎斧正!!!