7,抽象工厂模式

一:初始抽象工厂模式
包括:定义,,结构,参考实现
二:体会抽象工厂模式
包括:场景问题,不用模式解决方案,使用模式解决方案
三:理解抽象工厂模式
包括:认识抽象工厂模式,定义可扩展的工厂,抽象工厂模式和DAO,抽象工厂模式的优缺点
三:思考工厂方法模式
包括:抽象工厂模式的本质,何时选用

一,初始抽象工厂模式

1,提供一个创建一系列相关或相互依赖的接口,而无需指定他们具体的类

2,结构和说明
在这里插入图片描述
AbstractFactory:抽象工厂,定义创建一系列产品对象的操作接口
ConcreteFacotry:具体工厂,实现抽象工厂定义的方法,具体实现一系列产品对象的创建。
AbstractProduct:定义一类产品对象的接口。
ConcreteProduct:具体的产品实现对象,通常在具体的工厂里面,选择具体的产品实现对象,来创建符合抽象工厂定义的方法返回产品类型的对象。
Client:主要通过抽象工厂来 获取一系列的产品对象,然后面向产品对象的接口编程,以实现所需要的功能。

3,选择组装电脑的配件
只考虑CPU和主板的问题
具体使用什么配件,客户说的算,装机工程师只是负责组装,而客户负责装配所需要的具体配件

不用模式的解决方案 代码详见git@github.com:qinixiangyang111/design.git Abstractfactory包下example2

问题:
cpu对象和主板是相互匹配的,是有关系的,cpu的针脚数和主板的针洞必须相互匹配

使用模式解决方案,example3
创建一个抽象工厂给装机工程师用,定义抽象的创建CPU和主板的方法,这个抽象工厂就相当于一个抽象的装机方案,在这个装机方案中,各个配件是能够互相匹配的

二,理解抽象工厂模式

1,功能
为一系列相关对象或相互依赖的对象创建一个接口。从某种意义来看,抽象工厂是一产品系列,或产品簇

2,实现成接口
AbstractFactory在java中实现成为接口。

3,使用工厂方法
AbstractFactory定义了创建产品所需要的接口,具体的实现是实现类里面,通常在实现类里面就需要选择多种更具体的实现,所以AbstractFactory定义创建产品的方法可以看成工厂方法,而这些方法的实现延迟到具体的工厂里面。也就是说用抽象方法实现了抽象工厂;

4,调用顺序

在这里插入图片描述

5,定义可扩展的工厂
抽象工厂为每种它能创建的产品对象都定义了相应的方法,比如创建CPu方法,创建主板的方法等

麻烦:如果产品簇增加一种新的产品,比如增加创建内存的对象,那么抽象工厂需要增加创建内存的方法,且所有的具体工厂都要改变,非常不灵活

解决思路 :抽象工厂里面不需要定义那么多方法,定义一个方法就可以了,给这个方法设置参数,通过这个参数判断具体创建什么产品对象,返回类型就不能是具体的某个产品类型了,要么所有的产品实现某个接口,或者Object类型
但是不太安全(要强制转型,容易形成运行期的问题)代码见exmaple4

三,理解抽象工厂模式

1,抽象工厂和DAO

  • DAO 数据访问对象
  • 是JEE中一个标准模式,通过他解决访问数据所面临的一系列问题,比如:数据源,存储类型,访问方式,供应商版本,版本等,这些不同会造成访问数据的实现上差别很大
    使用DAO的系统结构图在这里插入图片描述

注意:DAO需要抽象和封装对所有的数据的访问,DAO承担和数据库交互的职责,访问数据的所有问题都需要DAO内部解决

2,实现DAO模式的时候,最常见的实现策略就是使用工厂的策略,而且多是使用抽象工厂实现,在使用抽象工厂模式来实现的时候,可以结合工厂方法模式。

3,DAO模式采用工厂方法来实现策略
在这里插入图片描述
4,采用抽象工厂模式来实现代码详见example5
在这里插入图片描述

5,优缺点

  • 分离接口和实现
  • 使得切换产品簇变得更容易
  • 不太容易扩展新的产品
  • 容易造成类层次复杂(比如数据源的实现local—db–oracle–oracleImpl)

四,思考抽象工厂模式

1,本质
选择产品簇(一系列对象且有联系)的实现(抽象方法:延迟到子类的实现,简单工厂:选择实现)

2,何时选用

  • 如果希望一个系统独立于它的产品创建,组合,和表示的时候,换句话说:希望一个系统只是知道产品的接口,而不关心实现的时候。
  • 如果一个系统要有多个产品系列中的一个来配置,换句话说:可以动态切换产品簇的时候
  • 如果要强调一系列相关产品的接口,一便联合使用它们的时候
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大道至简@EveryDay

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

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

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

打赏作者

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

抵扣说明:

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

余额充值