学习记录
工厂模式(Factory Pattern)属于创建型模式。在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
使用场景:
1. 日志记录:记录日志的方式可能有多种,这样客户端就可以通过工厂来选择不同的日志记录方式,来记录日志。
2. 数据库访问:用户通过工厂来选择数据库连接驱动。
我自己感觉,工厂就是一个字典,它知道从一堆东西里找到我们想要的东西。我们要东西的时候,就问工厂要,至于工厂是如何创建我们想要的东西的这个过程,我们不需要关心。
模式的结构与实现:
1. Factory:工厂,用来获取ProductA。
2. ProductA:需要创建的东西。
3. Client:客户端,实际要ProductA的人。
4. ProductA-1,ProductA-2,ProductA-3:具体创建的东西的不同种类。
模式讲解:
1. Client和Factory沟通,Client问Factory要ProductA中的一种。
2. Factory根据一种逻辑选择ProductA-1,ProductA-2,ProductA-3中的一个,可以根据产品名来获取。
3. Factory创建完选择的ProductA中的某一种之后,返回给Client。
例子:
创建订单后,需要将订单实例序列化保存到数据库。执行订单的时候,从数据库中获取订单记录,再反序列化生成订单,进而执行订单。这样将订单创建和订单执行的两个步骤解耦。序列化时,只是将订单中所有的任务名列表保存至数据库。反序列化时就需要通过任务名来生成任务,这里就可以用工厂模式来实现。
扩展:
工厂方法模式:
工厂模式有一个问题:类的创建依赖于工厂类。如果要拓展程序,那么必须修改工厂类。假如增加了产品种类ProductB,工厂类就需要修改。这时可以引入工厂方法模式,创建一个工厂接口和创建多个工厂实现类,这样一旦增加了产品种类,只要增加工厂类即可。
抽象工厂模式
简单的说,就是把工厂也给抽象成一个抽象类。工厂下面有不用的工厂实现,每个工厂实现都可以创建不同的东西。
工厂方法模式与抽象工厂模式的比较
参考:
https://www.runoob.com/design-pattern/abstract-factory-pattern.html
https://blog.csdn.net/auuea/article/details/84673570
https://blog.csdn.net/weixin_38853600/article/details/82586557