1、结构图
2、代码
/***********************************************************************
* 意图: 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
*
* 适用性:
* 1、当一个类不知道它所必须创建的对象的类的时候。
* 2、当一个类希望由它的子类来指定它所创建的对象的时候。
* 3、当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
*
* 协作:Creator依赖于它的子类来定义工厂方法,所以它返回一个适当的ConcreteProduct实例。
*
* 作者:董怀信
* 日期:2009-05-27
* *********************************************************************/
using System;
namespace DesignPattern.CreationalPattern.FactoryMethod
{
/// <summary>
/// 声明工厂方法,该方法返回一个Product类型的对象。
/// Creator也可以定义一个工厂方法的缺省实现,
/// 他返回一个缺省的concreteProduct对象。
/// </summary>
public abstract class Creator
{
public Creator()
{
}
public abstract Product FactoryMethod();
public virtual void AnOperation()
{
Product obj = this.FactoryMethod();
obj.DoSomething();
}
}
/// <summary>
/// 重定义工厂方法以返回一个ConcreteProduct实例。
/// </summary>
public class ConcreteCreator : Creator
{
public ConcreteCreator()
: base()
{
}
public override Product FactoryMethod()
{
return new ConcreteProduct();
}
}
/// <summary>
/// 定义工厂方法所创建的对象的接口。
/// </summary>
public abstract class Product
{
public abstract void DoSomething();
}
/// <summary>
/// 实现Product接口。
/// </summary>
public class ConcreteProduct : Product
{
public override void DoSomething()
{
Console.WriteLine("ConcreteProduct");
}
}
/// <summary>
/// 客户调用,以测试效果。
/// </summary>
public class Client
{
public void Test()
{
Creator creator = new ConcreteCreator();
creator.AnOperation();
}
}
}