一、定义
- 工厂方法模式(Factory Method Pattern),也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。
- 工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了面向对象的多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。在工厂方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不负责哪一个产品类被实例化这种细节,这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。
二、优缺点及应用场景
优点
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程。
- 灵活性增强,对于新产品的创建,只需多写一个相应的工厂类。
- 典型的解耦框架。高层模块只需要知道产品的抽象类,无须关心其他实现类,满足迪米特法则、依赖倒置原则和里氏替换原则。
缺点
- 类的个数容易过多,增加复杂度
- 增加了系统的抽象性和理解难度
- 抽象产品只能生产一种产品,此弊端可使用抽象工厂模式解决。
应用场景
- 客户只知道创建产品的工厂名,而不知道具体的产品名。如 TCL 电视工厂、海信电视工厂等。
- 创建对象的任务由多个具体子工厂中的某一个完成,而抽象工厂只提供创建产品的接口。
- 客户不关心创建产品的细节,只关心产品的品牌
三、模式结构
- 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
- 具体工厂(Concrete Factory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
- 抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
- 具体产品(Concrete Product):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
四、简单实现
abstract class Product { //抽象产品
public abstract void play();
}
class ConcreteProductA extends Product {//具体产品ConcreteProductA
@Override
public void play() { System.out.println("海尔电视机播放中......"); }
}
class ConcreteProductB extends Product {//具体产品ConcreteProductB
@Override
public void play() {
System.out.println("海信电视机播放中......");
}
}
abstract class Creator {//工厂类
public abstract Product manufacture();
}
class ConcreteCreatorA extends Creator{//A工厂
@Override
public Product manufacture() {
System.out.println("A工厂生产海尔电视机");
return new ConcreteProductA();
}
}
class ConcreteCreatorB extends Creator{//B工厂
@Override
public Product manufacture() {
System.out.println("B工厂生产海信电视机");
return new ConcreteProductB();
}
}
public class SimpleFactory {//测试类
public static void main(String[] args) {
ConcreteCreatorA creatorA = new ConcreteCreatorA();
ConcreteCreatorB creatorB = new ConcreteCreatorB();
creatorA.manufacture().play();
creatorB.manufacture().play();
}
}
UML类图如下:
运行截图如下:
(本文谨用于学习自用,文中部分内容引用自以下链接)
工厂方法模式(详解版)
深入理解设计模式(四):工厂方法模式