工厂方法模式(别名:虚拟构造):定义一个用于创建对象的接口,让其子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
概述
书上的例子个人觉得不是很好,因此这里我用Java集合里的一个例子来说明:
Java集合中有两个接口Collections和Iterator。现在有一个LinkedList类(实现了Collections接口)的对象,我们想创建一个Iterator类的实例来对该对象进行遍历,Iterator接口有很多子类,这里我们无法确定具体实例化哪个子类(实际上,我们也不可能实例化任何Iterator的子类,因为它们都是Collections接口的子类的内部类),因此Collections接口定一个一个获取Iterator子类对象的方法iterator()。这种模式就是工厂方法模式。
模式的结构
抽象产品(Product):抽象类或者接口,比如上述的Iterator接口,负责定义具体产品的方法
具体产品:实现Product接口的子类
构造者(Creator):一个接口或抽象类定义一个称为工厂方法的抽象方法,该方法返回具体产品类的实例,比如上述的Collections接口,工厂方法为iterator()。
具体构造者:实现Creator接口的子类,比如上述的LinkedList类,具体产品类作为LinkedList类的内部类而定义。
工厂方法模式的优点
- 工厂方法使用户不必知道它使用的对象是怎样被创建的,只需要知道该对象有哪些方法即可。比如通过LinkedList的iterator()方法获得Iterator对象,并不需要关心它怎么创建的。
- 使用工厂方法使用户的代码和某个特定的类的子类的代码解耦。比如创建Iterator对象,并不需要显式的创建Iterator子类的实例。