一:模式动机
定义了一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类。
二:模式定义
工厂方法模式又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。
在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
在简单工厂中,创建对象的是父类,而在工厂方法中,是由子类来创建对象。
三:模式结构
工厂方法模式包含如下角色:
AbstractProduct: 抽象产品
concreteProcuct:具体产品
AbstractFactory:抽象工厂
ConcreteFactory:具体工厂
四:代码实例
有四个角色,抽象工厂,具体工厂,抽象产品,具体产品。不再是由一个工厂类去实例化具体的产品,而是由抽象工厂的子类去实例化产品
1.抽象产品
public interface Bus { void run(); void stop(); }
2.具体产品ConcreteProduct
实现接口
public class BusImpl1 implements Bus { @Override public void run() { System.out.println("BusImpl1 is running"); } @Override public void stop() { System.out.println("BusImpl1 stop running"); } }
public class BusImpl2 implements Bus { @Override public void run() { System.out.println("BusImpl2 is running"); } @Override public void stop() { System.out.println("BusImpl2 stop running"); } }
3.抽象工厂Factory
定义产品生成接口
/** * 抽象工厂 */ public abstract class AbstractFactory { abstract public Bus create(); }
4.具体工厂ConcreteFactory
实现产品生成接口,生成具体产品角色对象
/** * 具体工厂 */ public class BusImpl1Factory extends AbstractFactory { @Override public Bus create() { return new BusImpl1(); } }
/** * 具体工厂 */ public class BusImpl2Factory extends AbstractFactory { @Override public Bus create() { return new BusImpl2(); } }
5.客户端:
public class Client1 { public static void main(String[] args) { // 由抽象工厂的子类去实例化产品 AbstractFactory busImpl1Factory = new BusImpl1Factory(); Bus busImpl1 = busImpl1Factory.create(); busImpl1.run(); AbstractFactory busImpl2Factory = new BusImpl2Factory(); Bus busImpl2 = busImpl2Factory.create(); busImpl2.stop(); } }
五:分析与总结
工厂方法模式又称为工厂模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品
工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。
在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
工厂方法模式的主要 优点 是增加新的产品类时无须修改现有系统,并封装了产品对象的创建细节,系统具有良好的灵活性和可扩展性;
其 缺点 在于增加新产品的同时需要增加新的工厂,导致系统类的个数成对增加,在一定程度上增加了系统的复杂性。
工厂方法模式适用情况包括:
一个类不知道它所需要的对象的类;
一个类通过其子类来指定创建哪个对象;
将创建对象的任务委托给多个工厂子类中的某一个,客户端在使用时可以无须关心是哪一个工厂子类创建产品子类,需要时再动态指定。