6,工厂方法模式

一:初始工厂方法模式
包括:定义,,结构,参考实现
二:体会工厂方法模式
包括:场景问题,不用模式解决方案,使用模式解决方案
三:理解工厂方法模式
包括:认识工厂方法模式,工厂方法模式与IOC、DI,平行的类层次结构,参数化工厂方法,工厂方法模式的优缺点
三:思考工厂方法模式
包括:工厂方法模式的本质,对设计原则的体现,何时选用

初始工厂方法模式

1,定义
一个用于创建对象的接口(方法,不实现),让子类绝对实例化那一个类,FactoryMethod使一个类实例化延迟到其子类

在这里插入图片描述
2,导出数据的框架
实现一个导出数据的应用框架,来让客户选择导出方式,并真正实现数据导出
通常这种系统,在导出数据,会有一种约定模式,比如导出成:文本,数据库,excel,加密

不用模式的解决方案 productmethod包下example2
问题:
对于实现导出数据业务功能的对象,他需要ExportFileApi的具体实例对象,但是它只知道ExportFileApi接口,而不知道具体实现,该怎么办?
//只是想使用接口,而不是用来创建,责任不明确 //然后真正导出,结构的扩展不是很方便,职责没有分离, if (type == 1) { api = new ExportText(); } else if (type == 2) { api = new ExportDb(); }else if(type==3){ //违反了开闭原则,对修改关闭, api=new ExportXml(); }

使用模式
在这里插入图片描述
代码详见 productmethod包下example3

理解工厂方法模式

1,功能
让父类在不知道具体实现情况下,完成自身的功能的调用,从具体的实现延迟到子类的实现

2,什么时候使用抽象类?既要约束子类的行为,又要为子类提供公共的功能

3,实现成抽像类
工厂方法的实现中,通常父类会是一个抽象类,里面包含创建所需对象的抽象方法,这些抽象方法就是工厂方法
子类只是选择具体的实现,没有实现业务功能

4,实现成具体类
提供一个默认的实现,用的相对比较多的 ,没有扩展任何的子类,如果有子类,会覆盖父类的方法

5,工厂方法的参数和返回值
工厂方法的实现中,可能需要参数,一边决定到底选用哪一种具体的实现,工厂方法返回的是被创建对象的接口对象,当然也可以是抽象类或一个具体类的实现

6,谁来使用工厂方法创建的对象
a,通常,应该是creator中其他的方法使用被创建的对象
b,客户端应该使用Creator对象或使用由Creator创建出的对象,
总结:客户端不直接使用工厂方法
在这里插入图片描述

7,工厂方法模式IOC,DI
a,概念
依赖注入:应用程序依赖容器创建并注入它所需要的外部资源。DI
控制反转:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源

b,理解

  • 参与者是谁? 应用程序,容器
  • 依赖:谁依赖谁?为什么需要依赖? 应用程序需要一些资源
  • 注入:谁注入谁?到底注入了什么? 容器注入应用程序,应用程序需要什么就注入什么
  • 控制反转:谁控制谁,控制什么?为何叫反转?容器控制应用程序,控制的是资源,不能主动获取,(正转应用主动获取)
  • 依赖注入和控制反转是同一的概念吗?不是同一概念,描述同一件事,相对不同的对象
    依赖:
    名词:依赖关系
    动词:谁依赖于谁动作
    依赖注入:依赖注入依赖,应用程序依赖容器,为它注入依赖(依赖关系)

c,过程
在这里插入图片描述
思想:松耦合,有利于功能复用。
最大的改变不是代码,而是思想上,发生主从换位变化,应用程序变成被动的被动等待IOC/DI容器创建并注入所需要的资源

8,工厂方法模式与IOC/DI的关系
思想相似,都是主动变被动,获得更灵活的程序结构

理解工厂方法模式

1,平行的类层次结构
假如有两个类层次结构,其中一个类层次中的每个类在另一个类层次中都有一个对应的类的结构,就被称为平行的类层次结构
(A1,A2,A3===B1,B2,B3)

在这里插入图片描述
如果类层次结构的行为和属性职责过多,把其中某一部分分离出来,形成两个平行的类层次结构
2,把一个类层次某些行为分离出来,让类层次中的类把原本属于自己的职责,委托给分离出来的类,从而使类层次变得更简单

3,参数化工厂方法
简单工厂是工厂方法的一个特例;

通过给工厂方法传递参数,让工厂根据参数的不同

4,优缺点
a,可以在不知具体实现的情况下编程(比较高层的实现或抽象)
b,更容易扩展对象的新版本
c,连接平行的类层次
d,具体产品对象和工厂方法的耦合性(工厂方法需要创建对象的)

5,简单工厂(选择实现,延迟到子类并没有,相当于压缩了)就是把工厂方法里中创建对象的功能放到工厂中
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大道至简@EveryDay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值