什么是工厂模式
工厂模式是创造型模式的第二简单的,也非常好理解,就像工厂是生成统一制式商品的,工厂模式的目的是为了创造统一规整的实例。
工厂模式前-简单工厂
简单工厂不属于工厂模式,更像是一种设计思想,他是模仿造工厂的逻辑而诞生的。我更想叫它生产线模式。
举个例子:有一个包子铺,简单工厂就是一条包子生产线,通过调用getInstance方法就能拿到一个新包子,至于这个包子是什么馅的,就看getInstance方法做的判断了。
只要告诉工厂我要什么包子,就给你一个对应包子实例。
工厂模式-工厂方法
工厂方法模式是将工厂的生产线做了细化,我们不直接用工厂去创建不同实例,而是用不同的生产线创建对应实例。
依旧是那个包子铺,以前是一条生产线生成各种馅的包子,生产线坏了,所有包子都产不了了,这合理吗?
不合理!那就改,把每个馅的包子都用专用生产线生成,需要什么包子就到对应包子生产线上要一个包子实例。
工厂模式-抽象工厂
抽象工厂是加入了产品族的概念,将原来只抽象一个维度的思想再加一个维度。我感觉我这话都很抽象,没关系,我们先看类图。
如果这个看得乱可以参考我学习时老师的图
依旧用包子铺举例,在发展壮大后,包子铺新增了馅饼产品,和包子拥有同样的馅,那包子和馅饼,不同的内馅就是两个抽象维度了。我们调用包子工厂,创建一个韭菜鸡蛋的实例,也能调用馅饼工厂创建一个韭菜鸡蛋实例。他们在韭菜鸡蛋接口层是相同的,但却是不同的产品。
工厂模式的优劣
说的都饿了,最后就粘一下笔记吧
简单工厂优点和缺点
优点:
封装了创建对象的过程,可以通过参数直接获取对象。把对象的创建和业务逻辑层分开,这样以后就避免了修改客户代码,如果要实现新产品直接修改工厂类,而不需要在原代码中修改,这样就降低了客户代码修改的可能性,更加容易扩展。
缺点:
增加新产品时还是需要修改工厂类的代码,违背了“开闭原则”。
工厂方法优点和缺点
优点:
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
- 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
缺点:
- 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。
什么时候使用工厂方法模式
- 需要使用很多重复代码创建对象时,比如,DAO 层的数据对象、API 层的 VO 对象等。
- 创建对象要访问外部信息或资源时,比如,读取数据库字段,获取访问授权 token 信息,配置文件等。
- 创建需要统一管理生命周期的对象时,比如,会话信息、用户网页浏览轨迹对象等。
- 创建池化对象时,比如,连接池对象、线程池对象、日志对象等。这些对象的特性是:有限、可重用,使用工厂方法模式可以有效节约资源。
- 希望隐藏对象的真实类型时,比如,不希望使用者知道对象的真实构造函数参数等。
抽象工厂优点和缺点
优点
-
对于不同产品系列有比较多共性特征时,可以使用抽象工厂模式,有助于提升组件的复用性.
-
当需要提升代码的扩展性并降低维护成本时,把对象的创建和使用过程分开,能有效地将代码统一到一个级别上
-
解决跨平台带来的兼容性问题
缺点
增加新的产品等级结构麻烦,需要对原有结构进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大不变,违背了开闭原则.