工厂模式

作为一种创建对象的模式,在任何需要生成复杂对象的地方,都可以使用工厂模式 

复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。如果使用工厂模式,就需要引入一个工厂类,会增加系统的复杂度

优点:

可以使代码结构清晰,有效地封装变化,扩展性比较好

对调用者屏蔽具体的产品类(迪米特法则)

降低耦合度

简单工厂模式:

工厂类,抽象产品,具体产品

具体商品是继承工厂的抽象商品实现的

工厂有上传抽象商品,七牛,阿里,腾讯三个具体商品是继承的上传抽象商品

使用过程是调用工厂的静态方法,对参数进行switch判断,根据参数不同,实例化不同的具体商品对象,然后调用该具体商品对象的上传方法,实现上传

优点:

客户端只需要知道该类对应的参数即可

 缺点:

所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类

违背开闭原则(对扩展开放,对修改关闭),对于新产品的加入,工厂类也需修改

具体产品不断增多,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,不利于维护和扩展

工厂方法模式:

工厂接口,工厂实现,抽象产品,具体产品

工厂方法模式是简单工厂模式的进一步抽象和推广

使用过程是实例化七牛,阿里或者腾讯的工厂,这些工厂都实现了一个工厂接口,这个接口有一个上传的方法,比如七牛会重写这个上传方法,在重写方法里会实例化七牛云上传的类,实现七牛云上传

优点:

客户端只需要知道创建具体产品的工厂类即可

定义一个创建对象的接口,让实现这个接口的类来决定实例化哪个类。类的实例化推迟到子类中进行,利用面向对象的多态性和里氏代换原则,在程序运行时,子类对象将覆盖父类对象,从而使得系统更容易扩展

符合开闭原则,每个具体商品都有一个工厂,对于新产品的加入,只需要增加一个创建新产品的工厂,这个工厂继承自抽象工厂即可,不需要改变原有代码,可维护性高

缺点:

 增加了类的数量,当有成千上万个类型的产品时,就需要有成千上万个工厂

抽象工厂模式:

抽象工厂,具体工厂,抽象产品,具体产品

抽象工厂模式,又称工具箱模式

抽象工厂模式是工厂方法模式的升级版本

引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题

将一些相关的产品组成一个产品族(位于不同产品等级结构中功能相关联的产品组成的家族),由同一个工厂来统一生产,这就是抽象工厂模式的基本思想。也解决了工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,增加系统的开销的问题

优点:

增加固定类型产品的不同具体工厂比较方便。例如生产win系统商品,只需要再创建一个生产win系统商品的工厂即可

可以在类的内部对产品族进行约束,而不必专门引入一个新的类来进行管理

当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象

增加新的产品族很方便,无须修改已有系统,符合开闭原则

缺点:

复杂,可读性没有工厂方法模式好 

产品族的扩展性不好,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的

增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了开闭原则

工厂模式的退化

当抽象工厂模式中每一个具体工厂类只创建一个产品对象,也就是只存在一个产品等级结构时,抽象工厂模式退化成工厂方法模式;

当工厂方法模式中抽象工厂与具体工厂合并,提供一个统一的工厂来创建产品对象,并将创建对象的工厂方法设计为静态方法时,工厂方法模式退化成简单工厂模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值