作者:TerryLee 创建于:2005-12-09 出处:http://terrylee.cnblogs.com/archive/2006/01/04/310716.html 摘录于:2013-02-28
结构图
意图
定义一个用户创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
适用性
- 当一个类不知道它所必须创建的对象的类的时候。
- 当一个类希望由它的子类来指定它所创建的对象的时候。
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
实现代码
现在我们考虑一个日志记录的例子假定我们要设计日志记录的类,支持记录的方法有FileLog和EventLog两种方式。在这里我们先不谈设计模式,那么这个日志记录的类就很好实现了。
1 using System; 2 namespace Log 3 { 4 public abstract class Log 5 { 6 public abstract void Write(); 7 } 8 // EventLog类 9 public class EventLog : Log 10 { 11 public override void Write() 12 { 13 Console.WriteLine("EventLog Write Success!"); 14 } 15 } 16 // FileLog类 17 public class FileLog : Log 18 { 19 public override void Write() 20 { 21 Console.WriteLine("FileLog Write Success!"); 22 } 23 } 24 } 25 namespace LogFactory 26 { 27 using Log; 28 // LogFactory类 29 public abstract class LogFactory 30 { 31 public abstract Log Create(); 32 } 33 // EventFactory类 34 public class EventFactory : LogFactory 35 { 36 public override Log Create() 37 { 38 return new EventLog(); 39 } 40 } 41 // FileFactory类 42 public class FileFactory : LogFactory 43 { 44 public override Log Create() 45 { 46 return new FileLog(); 47 } 48 } 49 } 50 namespace Customer 51 { 52 using Log; 53 using LogFactory; 54 public class Program 55 { 56 public static void Main(string[] args) 57 { 58 LogFactory factory = new EventFactory(); 59 Log log = factory.Create(); 60 log.Write(); 61 Console.Read(); 62 } 63 } 64 }
实现要点
1. Factory Method模式的两种情况:一是Creator类是一个抽象类且它不提供它所声明的工厂方法的实现;二是Creator是一个具体的类且它提供一个工厂方法的缺省实现。
2. 工厂方法是可以带参数的。
3. 工厂的作用并不仅仅只是创建一个对象,它还可以做对象的初始化,参数的设置等。
效果
1. 用工厂方法在一个类的内部创建对象通常比直接创建对象更灵活。
2. Factory Method模式通过面向对象的手法,将所要创建的具体对象的创建工作延迟到了子类,从而提供了一种扩展的策略,较好的解决了这种紧耦合的关系。