转载:http://terrylee.cnblogs.com/archive/2006/01/04/310716.html
意图
定义一个用户创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节。这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。在Factory Method模式中,工厂类与产品类(log)往往具有平行的等级结构,它们之间一一对应。
效果
1. 用工厂方法在一个类的内部创建对象通常比直接创建对象更灵活。
2. Factory Method模式通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系。
适用性
在以下情况下,适用于工厂方法模式:
1. 当一个类不知道它所必须创建的对象的类的时候。
2. 当一个类希望由它的子类来指定它所创建的对象的时候。
3. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
总结
Factory Method模式是设计模式中应用最为广泛的模式,通过本文,相信读者已经对它有了一定的认识。然而我们要明确的是:在面向对象的编程中,对象的创建工作非常简单,对象的创建时机却很重要。Factory Method要解决的就是对象的创建时机问题,它提供了一种扩展的策略,很好地符合了开放封闭原则。
public abstract class Log
{
public abstract void Write();
}
public class FileLog : Log
{
public override void Write()
{
Console.WriteLine("This is file log");
}
}
public class EventLog : Log
{
public override void Write()
{
Console.WriteLine("This is event log");
}
}
public abstract class LogFactory
{
public abstract Log Create();
}
public class EventFactory : LogFactory
{
public override Log Create()
{
return new EventLog();
}
}
public class FileFactory : LogFactory
{
public override Log Create()
{
return new FileLog();
}
}
static void Main(string[] args)
{
LogFactory factory = new EventFactory();
Log log = factory.Create();
log.Write();
Console.ReadLine();
}