工厂方法模式

一、问题导入

  之前介绍了简单工厂模式,发现简单工厂模式违背了开闭原则,就是在工厂类中存在一个静态的方法,并且是由这个静态的方法去创建所有的子类产品对象。

  当增加一个新的产品时,要打开源代码修改,增加一条 if 语句。现在针对这个问题,学习工厂放方法模式。

二、工厂方法模式

1.类图

在这里插入图片描述

2.类图分析

  (1)工厂方法模式与简单工厂方法模式的区别主要在:

工厂方法模式增加了一个工厂接口。也就是工厂方法模式让每一个具体的产品由一个对应的工厂去生产,将产品分类,一个工厂生产一类。而简单工厂方法模式就是不分类,都放在一起生成。

  (2)如何实现将产品分类呢,在工厂类中增加抽象的工厂接口,生产一种具体的产品就去继承一个具体子类工厂。比如A工厂生产A类产品。
在这里插入图片描述

三、工厂方法模式修改汽车保险条款例子

1.结构

在这里插入图片描述

2.代码实现

2.1 产品层次

在这里插入图片描述
(1)抽象产品类,里面有一个抽象方法,用于描述产品。
在这里插入图片描述
(2)具体产品继承抽象产品类,并实现抽象方法。
在这里插入图片描述

2.2 工厂层次

在这里插入图片描述
(1)将生成产品的工厂抽象化,抽象的工厂里面有一个抽象的方法,该方法用于创建创建产品对象。当有要生成的新品种产品时,就继承抽象工厂,得到一个具体的工厂去生产。
在这里插入图片描述
(2)有新的产品要生产,继承抽象工厂,并且实现抽象方法。得到具体的工厂,这个工厂用于创建人身类保险,然后返回人身保险类型对象。
在这里插入图片描述

2.3 客户端层次

  客户端如何去使用?

  (1)让客户选择保险类型
  (2)根据客户的选择保险类型,选择对应的生成工厂
  (3)得到对应的保险类型的对象,使用对象

  记住,要用抽象类工厂去存放具体工厂,这样就比较灵活。因为父类的变量可以存放子类的变量,而一开始不知道子类的类型是什么,也就是不知道工厂的类型。

  要用抽象的保险类型变量存放具体保险类型对象。总之,变量的类型尽量要声明为抽象的变量类型,也就是父类的变量类型。
在这里插入图片描述

3.得到启示

  会发现,工厂方法模式,将生成的产品分类了,每一种类型交给一个工厂去生成。这样满足了类的单一职责原则,同时也将大量的 if 语句去掉了,所以说:

  当程序中出现大量的 if 语句,可以考虑是否可以用工厂方法模式去修改优化。

四、简单工厂方法模式与工厂方法模式的比较

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.简单工厂方法模式

  一个工厂生成所有类型的产品。
在这里插入图片描述

2.工厂方法模式

  (1)将工厂分类,生产不同类型的产品。这也符合了开闭原则、依赖倒置原则,高层依赖于抽象,细节的实现也依赖于抽象。
在这里插入图片描述
  (2)工厂层次和产品层次满足了开闭原则,但是客户端现在还没有满足。当增加了新的类型,客户端就要修改源代码,增加 if 语句。

五、何时使用工厂方法模式

(1)依赖于用户的输入
在这里插入图片描述
(2)
在这里插入图片描述
(3)比如一个产品如何创建,只想让一个工厂知道。
在这里插入图片描述

(4)简单来说就是要生产多种产品,或者代码中有多种选择可以考虑工厂方法模式。

六、工厂方法模式设计方面的几种考虑

在这里插入图片描述
在这里插入图片描述
  意思就是将所有子类的共性东西抽象出来,放在父类中;不方便的超类中包含的方法,不是共性(也就是个性化的)的放在子类中。

  所以工厂方法模式的目的就是让客户拿到产品之后,只知道这是一个产品,具体是哪种产品不需要知道,因此在客户端中只能调用产品层次中抽象的、公共的方法。就像去买一辆车,客户不必要知道车是怎么做的。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值