一、什么是工厂方法模式
工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。
在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节。这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
在Factory Method模式中,工厂类与产品类往往具有平行的等级结构,它们之间一一对应。
二、工厂方法模式的结构与角色
三、工厂方法模式与简单工厂模式
四、工厂方法模式的实现要点
五、工厂方法模式的效果
六、工厂方法模式的适用性
在以下情况下,适用于工厂方法模式:
七、工厂方法模式的应用实例
需求:现在我们考虑一个日志记录的例子(这里我们只是为了说明Factory Method模式,实际项目中的日志记录不会这么去做,也要比这复杂一些)。假定我们要设计日志记录的类,支持记录的方法有FileLog和EventLog两种方式。
1、首先定义一个Log的抽象类,也就是抽象产品(Product)角色
1 //抽象产品(所以Log产品的父类)
2 public abstract class Log
3 {
4 public abstract void Write(); //定义一个记录日志的方法
5 }
2、定义一个EventLog类和FileLog类,也就是具体产品(Concrete Product)角色
1 //操作日志(继承自Log类,抽象产品)
2 public class EventLog : Log
3 {
4 public override void Write()
5 {
6 Console.WriteLine("Write a event log.");
7 }
8 }
9
10 //文件日志(继承自Log类,抽象产品)
11 public class FileLog : Log
12 {
13 public override void Write()
14 {
15 Console.WriteLine("Write a file log.");
16 }
17 }
3、定义一个IFactory的接口,也就是抽象工厂(Creator)角色,她是工厂方法模式的核心
1 //抽象工厂(所有的具体工厂类都要实现这个接口)
2 public interface IFactory
3 {
4 Log CreateLog(); //创建相应的产品
5 }
4、创建EventLogFactory类和FileLogFactory类,这两个类都必须实现抽象工厂(IFactory接口),这就是具体工厂(Concrete Creator)角色
1 //操作日志工厂(实现IFactory接口,抽象工厂)
2 public class EventLogFactory : IFactory
3 {
4 public Log CreateLog()
5 {
6 return new EventLog();
7 }
8 }
9
10 //文件日志工厂(实现IFactory接口,抽象工厂)
11 public class FileLogFactory : IFactory
12 {
13 public Log CreateLog()
14 {
15 return new FileLog();
16 }
17 }
5、最后看一下客户端代码
1 public class Client
2 {
3 public static void Main(string[] args)
4 {
5 IFactory factory = new EventLogFactory();
6 Log log = factory.CreateLog();
7 log.Write();
8
9 Console.Read();
10 }
11 }
在客户程序中,我们有效地避免了具体产品对象和应用程序之间的耦合,可是我们也看到,增加了具体工厂对象和应用程序之间的耦合。那这样究竟带来什么好处呢?我们知道,在应用程序中,Log对象的创建是频繁的,在这里我们可以把
1 LogFactory factory = new EventFactory();
这句话放在一个类模块中,任何需要用到Log对象的地方仍然不变。要是换一种日志记录方式,只要修改一处为:
1 LogFactory factory = new FileFactory();
其余的任何地方我们都不需要去修改。有人会说那还是修改代码,其实在开发中我们很难避免修改,但是我们可以尽量做到只修改一处。