设计模式就该这样学:基于经典框架源码和真实业务场景
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

7.2 使用抽象工厂模式解决实际问题

7.2.1 使用抽象工厂模式支持产品扩展

我们来看一个具体的业务场景,并且用代码来实现。还是以课程为例,咕泡学院的课程研发会有标准,每个课程不仅要提供课程的录播视频,还要提供老师的课堂笔记。相当于现在的业务变更为同一个课程不单纯包含一个课程信息,要同时包含录播视频、课堂笔记,甚至要提供源码才能构成一个完整的课程。首先在产品等级中增加两个产品:录播视频IVideo和课堂笔记INote。

IVideo接口的代码如下。

img

INote接口的代码如下。

img

然后创建一个抽象工厂CourseFactory类。

img

接下来创建Java产品族,Java视频JavaVideo类的代码如下。

img

扩展产品等级Java课堂笔记JavaNote类。

img

创建Java产品族的具体工厂JavaCourseFactory。

img
img

随后创建Python产品族,Python视频PythonVideo类的代码如下。

img

扩展产品等级Python课堂笔记PythonNote类。

img

创建Python产品族的具体工厂PythonCourseFactory。

img

最后来看客户端调用代码。

img

上面代码完整地描述了Java课程和Python课程两个产品族,也描述了视频和笔记两个产品等级。抽象工厂非常完美、清晰地描述了这样一层复杂的关系。但是,不知道大家有没有发现,如果再继续扩展产品等级,将源码Source也加入课程中,则代码从抽象工厂到具体工厂要全部调整,这显然不符合开闭原则。

7.2.2 使用抽象工厂模式重构数据库连接池

还是演示课堂开始的JDBC操作案例,我们每次操作都需要重新创建数据库连接。其实每次创建都非常耗费性能,消耗业务调用时间。我们使用抽象工厂模式,将数据库连接预先创建好,放到容器中缓存着,当业务调用时就只需现取现用。我们来看代码。

Pool抽象类的代码如下。

img
img
img
img

DBConnectionPool数据库连接池的代码如下。

img
img
img
img
img