概述

由来:原始社会自给自足->农耕社会小作坊->工厂流水线->现代产业链代工厂

分工模式演变:无分工->粗粒度分工->细粒度分工

简单工厂模式

定义:由一个工厂对象决定创建哪一种产品/类实例

描述:一种工厂负责创建同一类的对象,创建型工厂,不属于GOF23范畴

举例:  冠状病毒工厂负责创建不同型号的冠状病毒,如:新COVID-19,SARS-CoV等

            Java中 Calendar.getInstance(),LoggerFactory.getLogger(XXX.class) 等

使用场景:创建对象较少的情况,拒绝万能工厂

优点:只需要传入一个简单参数(或者不传),就可以获得需要的对象,掩盖创建细节

缺点:1. 职责划分太粗(职责重),增加新的产品需要修改创建逻辑,违背开闭原则

          2. 不易于扩展更为复杂的产品结构


工厂方法模式

定义:定义一个创建对象的接口,让实现这个接口的类来决定创建什么样的对象

描述:对象的创建推迟到子类中进行,创建型设计模式,解决产品扩展问题

举例:java logback包里的的ILoggerFactory,不同的实现对应不同的产品

使用场景:创建对象需要大量重复的代码,后续要考虑新增产品

优点:1. 用户只需要关心产品对应的工厂,不需要关心创建细节

          2. 扩展新产品符合开闭原则,提高系统的可扩展性


缺点:工厂相关类个数容易过多,增加了代码结构的复杂度,增加了系统的抽象性和理解难度

抽象工厂模式

定义:提供一个创建一系列相关或相互依赖的对象的接口,无需指定他们具体的实现类

描述:创建型设计模式

举例:1. java 数据库连接池的使用场景

          2. 做一个统一登录和支付功能模块,对接阿里。微信等公众平台实现登录和支付操作,需要定义一个平台级别的抽象工厂类/接口,

              再分别实现阿里、微信等平台,再调用具体某一平台的的某一功能进行操作

              伪代码:

             TdPubPlatformFactory platformFactory = new AliPubPlatformFactory();

              platformFactory.getLoginPlatfrom().login();

              platformFactory.getPaymentPlatfrom().pay();

 优点:将一个系列的产品族统一到一起进行创建,具体的产品在应用层进行代码隔离,无需关心创建细节

 缺点:规定了所有可能被创建的产品集合,产品族中扩展新的产品比较困难,需要修改抽象工厂的接口。增加了系统的抽象性和理解难度

           要是产品增加的不频繁(年级别),这种缺点还是可以接受的

 使用场景

  1. 应用层不依赖与产品类实例如何被创建。、实现等细节

  2. 强调的是一个系列的相关产品对象的创建,创建对应需要大量的重复代码

  3. 提供一个产品类的库,所有不同系列产品已同样的接口来实现,达到与客户端(应用层)的解耦

 总结

    简单工厂:产品的工厂

    工厂方法:工厂的工厂

    抽象工厂:复杂产品的工厂