工厂模式:
简单工厂:是产品的工厂
工厂方法:工厂的工厂
抽象工厂:复杂产品的工厂
简单工厂模式:Simple Factory Pattern, SFP
由一个工厂对象决定创建出哪一种产品类的实例
但它不属于 GOF 23(四人组)
适用于工厂类负责创建的对象较少的场景,且客户端只需要传入工厂类的参数
工厂类可结合反射、泛型进行代码优化
JDK中的体现:
Calendar.getInstance()
LoggerFactory.getLogger()
缺点:
工厂类的职责相对过重,不易于扩展过于复杂的产品结构
源码:
pattern.factory.simplefactory
============================================================================
工厂方法模式:Fatory Method Pattern, FMP
定义一个创建对象的接口,让实现这个接口的类来决定实例化哪个类,工厂方法让类的实例化推迟到子类中进行。
符合开闭原则
主要解决产品扩展问题
根据单一职责,拆分专人干专事,不同的产品由不同的工厂类创建,对工厂本身也做一个抽象
JDK中的体现:
LoggerFactory.getLogger()
Logger
适用场景:
创建对象需要大量的重复代码
客户端(应用层)不依赖于产品类实例如何被创建的、实现等细节
一个类通过其子类来指定创建哪个对象
缺点:
类的个数过多,增加复杂度(系统抽象性、理解难度)
源码:
pattern.factory.factorymethod
============================================================================
抽象工厂模式:Abastract Factory Pattern, AFP
提供一个创建一系列相关或相互依赖对象的接口,无须指定她们具体的类。
需要提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现
讲解抽象工厂前,需要了解两个概念:产品等级结构和产品族
产品族与产品等级结构的关系图?
源码:
pattern.factory.abstractfactory
如:描述两个产品族 Java课程和 Python课程,也描述两个产品等级 视频和笔记。
继续扩展产品等级,将源码也加到课程中,代码从抽象工厂到具体工厂全部都要调整
不符合开闭原则
缺点:
规定了所有可能被创建的产品集合,产品族中拓展新的产品困难,需要修改抽象工厂接口
增加系统抽象性和理解难度
实际应用中,千万不能犯强迫症,在实际需求中产品等级升级是非常正常的意见事情。
可以根据实际情况,只要不是频繁升级,可以不遵循开闭原则。
代码每半年升级一次或每年实际一次 由有何不可呢?
============================================================================
工厂模式实践案例
JDBC 操作案例
为了避免每次操作都需要重新创建数据库连接(非常耗性能,消耗业务调用时间)
利用工厂模式,将数据库连接预先创建好放到容器中缓存起来,业务调用时只需要现取现用。
源码:
sqlhelper.org.jdbc.sqlhelper
作业:
1.工厂类一定需要将构造方法私有化吗,为什么?
2.用工厂模式设计支付业务场景,包含跨境支付,支付宝、微信、银联支付,并画出类图。
/homework/subjects/7e7e7f7ff7g5dgc2g6fgf9