工厂方法模式(Factory Method pattern)

  1. 描述

    工厂方法模式,又称工厂模式、多态工厂模式和虚拟构造器(Virtual Constructor)模式,通过定义一个创建对象的接口,让子类决定实例化哪一个类。FACTORY METHOD将类的实例化(具体产品的创建)延迟到工厂类的子类(具体工厂)中完成。

FACTORY METHOD UML

  1. 实现

抽象工厂(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();
    }
}
  1. 适用场景
  • 当一个类不知道它所必须创建的对象的类的时候:客户端不需要知道具体的产品类,只需要知道所对应的工厂即可;
  • 当一个类希望由它的子类来指定它所创建的对象的时候:对于抽象工厂类只需要提供一个创建产品的接口,而由其子类来确定具体要创建的对象;
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候:客户端在使用时无须关心是哪一个工厂子类创建产品子类,需要时再动态指定,可将具体工厂类的类名存储在配置文件或数据库中。
  1. 优点
  • 对用户隐藏了哪种具体产品类将被实例化这一细节,用户只需要关心所需产品对应的工厂,无须知道具体产品类的类名;
  • 可以自主确定创建何种产品对象,而如何创建这个对象的细节则完全封装在具体工厂内部;
  • 加入新产品时,无须修改抽象工厂和抽象产品的接口,无须修改客户端,也无须修改其他的具体工厂和具体产品,而只要添加一个具体工厂和具体产品就可以了。
  1. 缺点
  • 添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度;
  • 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实现时可能需要用到DOM、反射等技术,增加了系统的实现难度。
  • 一个具体工厂只能创建一种具体产品
  1. 相关模式
  • Abstract Factory经常用工厂方法来实现;
  • 工厂方法通常在Template Methods中被调用;
  1. 参考文章
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值