概述
在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口。如何应对这种变化?提供一种封装机制来隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变?这就是要说的Factory Method模式了。
意图
定义一个用户创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace FactoryMethodDemo { //日志工厂接口 interface ILogFactory { ILog Create(); } //文件日志工厂类 class FileLogFactory:ILogFactory { public ILog Create() { return new FileLog(); } } //事件日志工厂类 class EventLogFactory : ILogFactory { public ILog Create() { return new EventLog(); } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace FactoryMethodDemo { //日志接口 interface ILog { void Write(); } //文件日志类 class FileLog : ILog { public void Write() { Console.WriteLine("FileLog Write"); } } //事件日志类 class EventLog : ILog { public void Write() { Console.WriteLine("EventLog Write"); } } }
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace FactoryMethodDemo { class Program { static void Main(string[] args) { string log = "FactoryMethodDemo.EventLogFactory"; //调用反射机制 ILogFactory factory; if (log != "") factory = (ILogFactory)Activator.CreateInstance(Type.GetType(log)); else factory = null; ILog logs = factory.Create(); logs.Write(); Console.Read(); /* LogFactory factory = new EventFactory(); Log log = factory.Create(); log.Write(); */ } } }
工厂方法解说
在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节。这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。在Factory Method模式中,工厂类与产品类往往具有平行的等级结构,它们之间一一对应。
现在我们考虑一个日志记录的例子(这里我们只是为了说明Factory Method模式,实际项目中的日志记录不会这么去做,也要比这复杂一些)。假定我们要设计日志记录的类,支持记录的方法有FileLog和EventLog两种方式。在这里我们先不谈设计模式,那么这个日志记录的类就很好实现了
|--Ilog write();
|--FileLog:ILog
|--EventLog:ILog
|--ILogFactory ILog Create();
|--FileLogFactory:ILogFactory
|--EventLogFactory:ILogFactory