工厂模式
目录
1、工厂模式概念
2、工厂模式的意图
3、什么情况下适合工厂模式
4、工厂模式的设计思想
5、工厂模式的应用场景
6、工厂模式的优缺点
7、工厂方法模式和抽象工厂模式对比
参考资料:
https://www.imooc.com/learn/261
https://blog.csdn.net/wfg18801733667/article/details/60954744
工厂模式实践代码
1、工厂模式概念
- 简单工厂模式:由一个工厂对象根据收到的消息决定要创建哪一个类的对象实例。
- 工厂方法模式: 定义一个创建对象的工厂接口,让子类决定实例化哪一个类,将实际创建工作推迟到子类当中。
- 抽象工厂: 抽象工厂是围绕一个超级工厂创建其他工厂,该超级工厂又称为其他工厂的工厂。提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类
实例化对象,用工厂方法代替new操作。
工厂模式包括工厂方法模式、抽象工厂模式。
抽象工厂模式是工厂方法模式的扩展。
2、工厂模式的意图
定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化。
工厂方法把实例化的工作推迟到子类中去实现。
项目中的现状:
在软件系统中经常面临着“对象”的创建工作,由于需求的变化,这个对象可能随之也会发生变化,但它却拥有比较稳定的接口。
为此,我们需要提供一种封装机制来隔离出这个易变对象的变化,从而保持系统中其他依赖该对象的对象不随着需求变化而变化。
如果我改变了某个对象,希望依赖于他的对象不随之发生变化;
3、什么情况下适合工厂模式
(1)有一组类似的对象需要创建;
(2)在编码时不能预见需要创建哪种类的实例;
(3)系统需要考虑扩展性,不应依赖于产品类实例如何被创建、组合和表达的细节;
工厂类负责创建的对象比较少,客户只需要传入工厂类参数,对于如何创建对象(逻辑)不关心。
简单工厂模式很容易违反高内聚低耦合的原则,因此一般只在很简单的情况下使用。
4、工厂模式的设计思想
基于项目现状将代码进行如下设计:
1)、尽量松耦合,一个对象的依赖对象的变化与本身无关
2)、具体产品与客户剥离,责任分割
5、工厂模式的应用场景
工厂模式的使用场景:
工厂类负责创建的对象比较少,客户只需要传入工厂类参数,对于如何创建对象(逻辑)不关心。
简单工厂模式很容易违反高内聚低耦合的原则,因此一般只在很简单的情况下使用。
工厂模式适用于哪些场景:
1、一个系统应当不依赖产品类实例被创立,组成,和表示的细节。这对应所有形态的工厂模式都是重要的;
2、这个系统的产品至少有一个的产品族;
3、同属于同一个产品族的产品是设计成在一起使用的。这一约束必须得在系统的设计中体现出来;
4、不同的产品以一系列的接口的面貌出现,从而使系统不依赖于接口实现的细节;
工厂方法模式的使用场景:
1)、日志记录器:记录可能记录到本地硬盘、系统事件、远程服务器等,用户可以选择记录日志到什么地方。
2)、数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时。
3)、设计一个连接服务器的框架,需要三个协议,"POP3"、"IMAP"、"HTTP",可以把这三个作为产品类,共同实现一个接口。
抽象工厂的使用场景:
系统的产品多于一个产品族,而系统只消费某一族的产品。
6、工厂模式的优缺点
优点:
工厂模式的实现帮助我们:
1、系统可以在不修改具体工厂角色的情况下引进新的产品;
2、客户端不必关心对象如何创建,明确了职责;
3、更好的理解面向对象的原则,面向接口编程,而不要面向实现编程;
(1)工厂模式的优点
最大的优点在于工厂类中包含了必要的逻辑,根据客户需要的逻辑动态实例化相关的类。
(2)工厂方法模式的优点
创建对象的接口,让子类决定具体实例化的对象,把简单的内部逻辑判断移到了客户端。
工厂方法模式克服了简单工厂所违背的开闭原则的缺点,又保持了封装对象创建过程的优点。
扩展性高,想要增加一个产品,只要扩展一个工厂类就可以。
(3)抽象工厂的优点
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点
** (1)简单工厂模式的缺点**
每增加一个产品,相应的也要增加一个子工厂,加大了额外的开发量。
7、工厂方法模式和抽象工厂模式对比
1、工厂模式是一种极端情况的抽象工厂模式,而抽象工厂模式可以看成是工厂模式的推广;
2、工厂模式用来创建一个产品的等级结构,而抽象工厂模式是用来创建多个产品的登记结构;
3、工厂模式只有一个抽象产品类,而抽象工厂模式有多个抽象产品类;
总结
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。