1,定义
所谓工厂方法模式(Factory Method Pattern),就是定义一个创建产品对象的工厂接口,让子类决定实例化哪一种实例对象,也就是将实际创建实例对象的工作推迟到子类当中,核心工厂类不再负责具体产品的创建。
2,优点
- 简单工厂模式的进一步抽象,可以使系统在不修改具体工厂角色的情况下引进新的产品, 完全实现“开-闭”原则, 对扩展开发,对修改关闭
- 依赖于抽象,而不是具体的实现类, 大大降低了客户程序与实现细节的耦合度
- 可以使代码结构清晰,有效地封装变化。在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品。
3, 使用场合
- 当子类可能会很多, 以后需要不断的增添子类实现时;
- 当一个系统尚在框架设计阶段,还不知道将来需要实例化哪些具体类时;
- 系统设计之初不需要具体对象的概念
通过工厂方法模式的类图可以看到,工厂方法模式有四个要素:
- 工厂接口:工厂接口是工厂方法模式的核心,与调用者直接交互用来提供产品。
- 具体工厂:具体工厂决定如何实例化产品,是实现扩展的途径,需要有多少种产品,就需要有多少个具体的具体工厂。
- 抽象产品:抽象产品的主要目的是定义产品的规范,所有的具体产品都必须遵循抽象产品所定义的规范。
- 具体产品:抽象产品的具体实现,决定了产品在客户端中的具体行为。
抽象工厂生产抽象产品,具体工厂生产具体产品
工厂接口
public interface ICreateCar { public AbstractCar createCar() ; }
具体工厂
public class FactoryKindCar implements ICreateCar { @Override public AbstractCar createCar() { return new KindCar("KindCar","Red"); } }
抽象产品
public abstract class AbstractCar { protected String name; protected String color; public abstract void start(); }
具体产品
public class KindCar extends AbstractCar { public KindCar(String name,String color) { this.name = name; this.color = color; } @Override public void start() { System.out.println("The car "+this.name+" color with "+this.color+" is running!"); } }
下面建立一个客产测试程序:
public class FactoryMethodTesting { public static void main(String[] str) { ICreateCar createcar = new FactoryKindCar(); AbstractCar car = createcar.createCar(); car.start(); } }
这里突出一个原则,永远面向抽象及接口编程,而不是具体实现, 假如有一种新的车要增加,我们只需添加一个具体产品与具体工厂, 丝毫不会影响原来的应用逻辑,支持“开-闭原则。
动行结果