-
描述
工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器(Virtual Constructor)模式,通过定义一个创建对象的接口,让子类决定实例化哪一个类。FACTORY METHOD将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成。
- 实现
抽象工厂(Factory): 创建抽象工厂类,定义具体工厂的公共接口
interface Factory {
Product createProduct();
}
抽象产品(Product): 创建抽象产品类 ,定义具体产品的公共接口
interface Product{}
具体产品(Concrete Product): 继承抽象产品类 & 定义生产的具体产品
// 具体产品A类
class ProductA implements Product {}
// 具体产品B类
class ProductB implements Product {}
具体工厂(Concrete Factory):继承抽象工厂类,定义创建对应具体产品对象的方法
//工厂A类 - 生产A类产品
class FactoryA implements Factory {
@Override
public Product createProduct() {
return new ProductA();
}
}
//工厂B类 - 生产B类产品
class FactoryB implements Factory {
@Override
public Product createProduct() {
return new ProductB();
}
}
客户端程序:外界通过调用具体工厂类的方法,从而创建不同具体产品类的对象
// 生产工作流程
public class FactoryMethodPattern {
public static void main(String[] args){
// 创建产品A
Factory factoryA = new FactoryA();
Product productA = factoryA.createProduct();
// 创建产品B
Factory factoryB = new FactoryB();
Product productB = factoryB.createProduct();
}
}
- 适用场景
- 当一个类不知道它所必须创建的对象的类的时候:客户端不需要知道具体的产品类,只需要知道所对应的工厂即可;
- 当一个类希望由它的子类来指定它所创建的对象的时候:对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象;
- 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候:客户端在使用时无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。
- 优点
- 对用户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无须知道具体产品类的类名;
- 可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部;
- 加入新产品时,无须修改抽象工厂和抽象产品的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。
- 缺点
- 添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度;
- 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。
- 一个具体工厂只能创建一种具体产品
- 相关模式
- Abstract Factory经常用工厂方法来实现;
- 工厂方法通常在Template Methods中被调用;
- 参考文章