工厂模式

鉴于课程中的工厂模式确实讲得不好,所以我自己总结整理了一篇。

一、简单工厂模式

定义:专门定义一个类用来创建其他类的实例,被创建的实例通常具有共同的父类。

简单工厂模式不是23种里的一种,简而言之,就是有一个专门生产某个产品的类
比如下图中的鼠标工厂,专业生产鼠标,给参数0,生产戴尔鼠标,给参数1,生产惠普鼠标。
在这里插入图片描述
有三个要素:

  • 产品接口
  • 产品实现
  • 工厂实现

每次想要获得不同的产品时,只需要向工厂中传入不同的值即可
如果此时想创建第三种产品,比如华硕鼠标,也实现了Mouse。那么就要在工厂类中进行修改,而不是扩展。所以简单工厂模式的可扩展性比较差。

二、工厂方法模式

定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类,使一个类的实例化延迟到其子类。

以简单工厂模式的鼠标为例,有一个抽象的父类鼠标工厂,戴尔鼠标工厂以及惠普鼠标工厂继承此抽象类,并且实现生产鼠标的方法。
这样,在new一个工厂的时候指定相应的工厂,然后使用对应的工厂就可以得到不同的产品了。
在这里插入图片描述
有四个要素:

  • 工厂接口
  • 工厂实现
  • 产品接口
  • 产品实现

相比于简单工厂模式,多了一个工厂接口,将工厂抽象化,并且让不同的工厂来实现这个抽象类。
这样,当要新增加一种鼠标时,只需要新建一个工厂类来实现抽象的工厂接口即可,在调用端只需要新建一个对应的工厂即可得到产品

三、抽象工厂模式

定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

抽象工厂模式与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构

抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。

还是拿上面的例子,假如还需要生产键盘怎么办?那么键盘和鼠标就同属于PC产品族。
这时就在抽象类中新增加一个方法createKeybo(),那么让具体的HpFactory和DellFactory来实现这个方法。当然还要有新的产品接口和产品实现类。
在这里插入图片描述
优点:
最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理
缺点:
在产品族中新建一个产品则所有的工厂类都要进行修改。

工厂模式的优点

  • 可以使代码结构清晰,有效地封装变化。在编程中,产品类的实例化有时候是比较复杂和多变的,通过工厂模式,将产品的实例化封装起来,使得调用者根本无需关心产品的实例化过程,只需依赖工厂即可得到自己想要的产品。
  • 调用者屏蔽具体的产品类。如果使用工厂模式,调用者只关心产品的接口就可以了,至于具体的实现,调用者根本无需关心。即使变更了具体的实现,对调用者来说没有任何影响。
  • 降低耦合度。产品类的实例化通常来说是很复杂的,它需要依赖很多的类,而这些类对于调用者来说根本无需知道,如果使用了工厂方法,我们需要做的仅仅是实例化好产品类,然后交给调用者使用。对调用者来说,产品所依赖的类都是透明的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值