第一讲 工厂方方法模式(简单工厂方法模式)

一、工厂方法模式的引入

1.问题引入

  怎么调用某个类中的方法?如果一个应用对象准确地知道调用哪个方法,则它可以直接初始化包含该方法的类。

  但是怎么调用一个层次类中的方法,该类包含了许多子类,而你不知道调用哪个

2.常见设计方法

  (1)在这种情况下,应用对象需要使用条件语句在层次类中初始化包含所需功能的合适的类,见下面例子。
在这里插入图片描述
  (2)该设计的缺点

  a)高耦合:
  因为每个想使用层次类提供服务的对象必须要去实现(了解)类的选择标准,导致了应用类与服务提供层次类的高耦合。

  b)难看的条件语句:
  想使用层次类提供服务的对象中必须包含许多条件语句
在这里插入图片描述

  c)客户类应该知道被调用类的全部细节:
  要求应用对象要全部知道层次类中每个类包含了什么样的功能。

3.常见的设计方法是否满足开闭原则

1)、当选择类的标准发生变化,会怎么样?
2)、当创建类的方法发生变化,会怎么样?
3)、当增加新的类,会怎么样?

4.使用工厂方法模式改善

  在此情况下,可以使用工厂方法模式(FactoryMethod pattern)。 该模式建议:

  指定一个类,将从层次类中选择所需要的类,并且将初始化该类对象的功能封装在该类一个方法中。

  该指定的类叫做工厂类,该方法叫做工厂方法。为什么叫做工厂方法,工厂是用来生成创造东西的。那么根据这个方法,在写代码时,我们将初始化的工作放到一个工厂类。

  工厂方法负责选择一个所需的类,并且创建该类的方法。工厂方法将多个变化点集中到一个点上。

  (1)原来是在main 方法中写一大堆 if 语句,现在再创建一个类,这个类中 有具体的方法,其实也就是将原来在 main 中的代码移到另一个类(工厂方法)中。
在这里插入图片描述
  (2)工厂模式就是将使用者和生成者分隔开来。

5.工厂方法的功能

  (1)工厂方法可以定义为完成如下事情的方法:

-根据应用环境和其它的因素,在层次类中选择一个类;

-创建所选择类的对象;

-返回给调用者所创建的对象(该对象的类型应该是层次类的超类(父类)类型)

举个生活中的例子:

比如想买一辆车,只需要告诉生产者你的需求,那么他们就会根据需求去创造满足需求的汽车给你。不用你担心为了满足需求他们是怎么选择配件的,怎么生成的。

  (2)工厂方法的优点

  1)使客户程序清晰

  因为应用对象可以使用工厂方法访问合适的类的对象,所以,应用对象就不需要处理类的选择标准问题。

  2)隐藏了创建对象的细节

  因为不同的子类的对象需要以不同的方式创建,工厂方法将根据环境、客户选择而把创建对象的繁琐细节封装了起来。就比如造车,工厂没必要把所有的生产过程展示给用户。

  3)客户不需要知道哪个具体的类的对象被创建了

  因为工厂方法返回给客户类的对象的类型为层次类的超类类型,所以客户类不需要知道哪个具体的子类的对象被创建了。

二、简单工厂方法模式以及设计案例

例1:汽车保险条款

  主要功能是能根据客户选的不同车险类型,显示车险的具体内容。

在这里插入图片描述

1.思路

  所有程序应该有三个部分:客户端,product(产品:汽车保险)和简单工厂类。

  (1)分析一下产品,产品就是汽车保险,有多种类型,各种类型之间有相同或者相似的地方。所以抽象出一个保险父类,不同的保险去继承父类的方法、属性

  (2)设计一个简单工厂方类,在这个类里面创建一个方法,这个方法根据客户不同的需求,创建不同的保险对象

2.设计结果

在这里插入图片描述

2.1 产品类

  下面就是产品类:
在这里插入图片描述

(1)汽车保险:
在这里插入图片描述
(2)获得保险描述:
在这里插入图片描述
(3)保险的类型:

1)人身险:
在这里插入图片描述
2)综合险:
在这里插入图片描述

2.2 客户端

在这里插入图片描述

2.3 工厂类

在这里插入图片描述
  工厂类中需要一个静态方法,用于不同产品的创建;根据用户的选择去创建,用户的选择可以作为参数,根据不同的值去生成不同的保险对象。

在这里插入图片描述

3.代码实现

3.1 产品类的实现

  产品类的职责就是列出保险的种类以及描述,这就像生活中,去买东西,卖家给的商品菜单。将产品的功能属性描述出来,这个类中包含了多种类型对象的描述,对应的对象调用就会显示对应的描述。就像是一本菜单,有多个菜品,每个菜品有对应的描述。
(1)
在这里插入图片描述
(2)
在这里插入图片描述
(3)java源码
在这里插入图片描述
在这里插入图片描述

3.2 工厂类的实现

  工厂类的职责就是根据用户的需求,创建出对应的对象,并返回对象的父类。只是将对象生产出来。
在这里插入图片描述
(1)先生定义一个父类保险类型,用于存放创建的子类保险:
在这里插入图片描述
(2)根据参数(用户的选择类型)去选择类型:
注意返回值是抽象类型的保险。
在这里插入图片描述

3.3 客户端的实现

  客户端类:负责将需求传递给简单工厂类。就像生活中,买东西,要将自己的需求传给生产商。生产商交付了产品之后,使用产品。

(1)客户的选择参数怎么来

(2)根据参数调用简单工厂方法(说需求给生产商)

(3)得到保险对象之后,根据业务需要调用对象中的方法(得到产品,使用产品中的功能)。

在这里插入图片描述
  补充静态方法的优点:在调用的时候,直接通过方法的名字来调用,不需要把包含这个静态方法对象创建了才能调用。
在这里插入图片描述
  option:客户的需求,将自己的需求告诉生产商(工厂),工厂将生产出来。交付给客户端。

在这里插入图片描述
  客户使用。
在这里插入图片描述

2.总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  应该是违背了开闭原则。
在这里插入图片描述

三、简单工厂方法模式结构

1.简单工厂方法模式类图

  简单工厂模式类图:
在这里插入图片描述

2.模式中的组件

在这里插入图片描述

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值