-
意图:
定义一个用于创建对象的接口,让子类决定示例化哪一个类。Factory Method使一个类的实例化延迟到其子类。 -
别名:
虚拟构造器(Virtual Constructor) -
动机:
框架使用抽象类定义和维护对象之间的关系。这些对象的创建通常也用框架负责。 -
适用性:
a. 当一个类不知道它所必须创建的对象的类的时候。
b. 当一个类希望由它的子类来指定它所创建的对象的时候。
c. 当类将创建对象的职责委托给多个帮助子类中的某一个,并且希望将哪一个子类是代理这一信息局部化的时候。 -
结构:
-
参与者:
a. Product: 定义工厂方法所创建的对象接口
b. ConcreteProduct: 实现Product接口
c. Creator:
声明工厂方法,该方法返回一个Product类型对象。
Creator也可以定义一个工厂方法的缺省实现它返回一个缺省的ConcreteProduct对象。
可以调用工厂方法创建一个Product对象。
d. ConcreteCreator:重新定义工厂方法以返回一个ConcreteProduct实例。 -
协作:
Creator依赖于它的子类来定义工厂方法,所以它返回一个适当的ConcreteProduct实例。 -
效果:
a. 为子类提供挂钩(hook)。
b. 连接平行的类层次。 -
实现:
a. 主要有两种不同的情况: 1.Creator类是一个抽象类并且不提供它声明的工厂方法实现。
2.Creator是一个具体的类而且工厂方法提供一个缺省的实现。
b. 参数化工厂方法
c. 特定语言的变化和问题
d. 使用模板以避免创建子类 -
代码示例:
//产品接口 public interface Product { public void describe(); } //具体的产品 public class ConcreteProduct implements Product{ @Override public void describe() { System.out.println("This is product"); } } //创建器 public interface Creator { public Product factoryMethod(); public void anOperation(); } //具体的创建器 public class ConcreteCreator implements Creator { @Override public Product factoryMethod() { return new ConcreteProduct(); } @Override public void anOperation() { } } //客户端调用 public class Client { public static void main(String[] args) { Creator creator = new ConcreteCreator(); Product product = creator.factoryMethod(); product.describe(); } }
-
已知应用:
工厂方法主要用于工具包和框架中。 -
相关模式:
Abstra Factory经常用工厂方法来实现。
工厂方法通常在Template Methods中被调用。
Prototypes不需要创建Creator的子类。