概述
由来:原始社会自给自足->农耕社会小作坊->工厂流水线->现代产业链代工厂
分工模式演变:无分工->粗粒度分工->细粒度分工
简单工厂模式
定义:由一个工厂对象决定创建哪一种产品/类实例
描述:一种工厂负责创建同一类的对象,创建型工厂,不属于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. 提供一个产品类的库,所有不同系列产品已同样的接口来实现,达到与客户端(应用层)的解耦
总结:
简单工厂:产品的工厂
工厂方法:工厂的工厂
抽象工厂:复杂产品的工厂