创建型设计模式之工厂模式

工厂模式

工厂在现实生活中给我们的印象就是一个生产者的角色,我们需要什么产品,跟它进行相应的描述后,就由它直接进行生产,我们只需等待它生产完,拿成品去使用就行了。

工厂模式可分为简单工厂模式、工厂方法模式、抽象工厂模式。下面将对其进行一一介绍。

①简单工厂模式

简单工厂没有抽象的工厂接口,侧重于能够根据客户端不同的入参而返回相应的对象,并且获取产品的方法一般是静态的。

如下图,SimpleClothesFactory的createClothes可以根据不同的参数返回不同的实现了Clothes接口的实例。
在这里插入图片描述
根据上图的代码实现:

Clothes接口
在这里插入图片描述
Shirt衬衫类
在这里插入图片描述
Skirt裙子类
在这里插入图片描述
Pants裤子类
在这里插入图片描述
工厂类
在这里插入图片描述
这里的工厂类生成结果的方式可以是分支判断结构,也可以是反射的方式,利用反射的话代码会较为简单,也比较适合与配置文件配合起来使用。

简单工厂比较适用于客户端对产品的需求较为稳定,可以一直都适用这个工厂类的情况。简单工厂的坏处是它违背了开闭原则,当有产品变动需要修改源代码,但它的好处是可以大大减少工厂数量。除此之外,简单工厂也可以配合多种抽象产品一起使用,每种抽象产品对应一个生产方法。

②工厂方法模式

In class-based programming, the factory method pattern is a creational
pattern that uses factory methods to deal with the problem of creating
objects without having to specify the exact class of the object that
will be created.

在基于类的编程中,工厂方法模式是利用工厂方法来解决创建对象的问题,而不用明确指定创建哪种类对象。

工厂方法一般分为两个维度,一个是具体产品,一个是具体工厂,两者间的关系是一一对应的,每个工厂类负责去初始化对应的具体产品。

如下图,客户端直接获取Factory的对应生产某产品的子类,调用工厂方法createProduct(),就能得到一个对应的对象,简而言之就是我们将new的这个动作交给了工厂的工厂方法。

在这里插入图片描述

对应上图的代码实现:
首先需要将产品和工厂分别抽成接口
在这里插入图片描述
在这里插入图片描述
其次相应的产品和工厂则实现相应的接口
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
客户端的编写方式
在这里插入图片描述
工厂方法实际上是抽象工厂的一个特例,抽象工厂和产品间是1:n的关系,而当n=1时就变为了工厂方法。当类的种类较少,一般只需要用到一种,适合构建这种一一对应关系的情况下可以采用工厂方法模式。工厂方法是符合开闭原则的,扩展性较强,当系统需要更改使用的产品时,新增一个产品和工厂对象即可。

③抽象工厂模式

抽象工厂是工厂模式里面相对来说最复杂的,如前面提到的,工厂方法是抽象工厂的特例,而客观点看的话抽象工厂就是一个工厂有多个工厂方法。

抽象工厂面对的同样是工厂和产品,只不这里的产品不再是一件,而是一个产品族,即一系列产品品牌的集合。举个例子说,我们用的空调,有美的的,格力的,松下的,并且美的、格力、松下这三家公司都非常牛逼,它们旗下并不仅限于空调产品,还有冰箱、洗衣机等。假设这三家公司下的每一个工厂,都会同时在工厂里生产这三种产品,那么,从代码角度讲,就相当于它们的工厂里分别有三个生产方法啦,而对应的生产工厂其实就是抽象工厂啦。

不过抽象工厂有一个衡量点,就是你如何选择你的产品族才能达到最优。我们分析一下下面两种方案:

方案1:选择品牌作为顶层抽象工厂接口。坏处是如果美的新增了电视产品,那顶层抽象接口需要更改,其他品牌的工厂也要更改,但是它们并没有电视产品,对于它们,电视生产方法毫无意义。好处是如果新增了某一个品牌,并且接口里的产品方法能够满足它的需要的话,原先的一切都不用做改动,只需要新增一个工厂即可。

方案2:选择产品作为顶层抽象接口。好处是如果某一品牌新增了某项产品,则只需要增加一个新产品工厂,但原先的工厂并不用做改动。坏处是如果新增了某一品牌,并且这一品牌的产品,原先的品牌也有,那么顶层抽象类需要更改,原先的产品工厂也要更改。

使用抽象工厂时,还是要看业务变动趋势,去选取相应的维度。

在这里插入图片描述
以下是对应上图的代码
首先创建产品和工厂的抽象
在这里插入图片描述
接着按照品牌创建它们的产品,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后创建每个品牌的工厂
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以采用配置方式,来外部切换工厂
在这里插入图片描述
在这里插入图片描述
最后结果
在这里插入图片描述

工厂模式的优点是比较适合创建复杂对象,可以将类的使用与创建分隔开来,达到一定的解耦。工厂模式有一个比较鲜明的地方是,它只和熟悉的类打交道,不管是产品族还是单件产品,非常符合迪米特法则。将实例化的任务交给工厂,当系统有新的类增加时,直接交由工厂去处理,基本不会影响到类的使用,所以工厂模式的扩展性也是较为理想的。但是工厂模式会增加大量的工厂类,导致系统的复杂度大大上升。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值