1.初识抽象工厂模式
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
- AbstractFactory:抽象工厂,定义创建一系列产品对象的操作接口。 ConcreteFactory:具体的工厂,实现抽象工厂定义的方法,具体实现一系列产品对象的创建。
AbstractProduct:定义一类产品对象的接口。
ConcreteProduct:具体的产品实现对象,通常在具体工厂里面,会选择具体的产品实现对象,来创建符合抽象工厂定义的方法返回的产品类型的对象。
Client:客户端,主要使用抽象工厂来获取一系列所需要的产品对象,然后面向这些产品对象的接口编程,以实现需要的功能。
2.体会抽象工厂模式
2.1 场景问题
举个生活中常见的例子——组装电脑,我们在组装电脑的时候,通常需要选择一系列的配件,比如:CPU、硬盘、内存、主板、电源、机箱等等。为了使讨论简单点,只考虑选择CPU和主板的问题。对于装机工程师而言,他只知道组装一台电脑,需要相应的配件,但是具体使用什么样的配件,还得由客户说了算。也就是说装机工程师只是负责组装,而客户负责选择装配所需要的具体的配件。
问题:
现在需要使用程序来把这个装机的过程,尤其是选择组装电脑配件的过程实现出来,该如何实现呢?
2.2 不用模式的解决方案
存在的问题:
虽然上面的实现,通过简单工厂解决解决了:对于装机工程师,只知CPU和主板的接口,而不知道具体实现的问题。但还有一个问题没有解决,什么问题呢?那就是这些CPU对象和主板对象其实是有关系的,是需要相互匹配的。
2.3 使用模式的解决方案
来看看如何使用抽象工厂模式来解决前面提出的问题。
装机工程师要组装电脑对象,需要一系列的产品对象,比如CPU、主板
等,于是创建一个抽象工厂给装机工程师使用,在这个抽象工厂里面定义抽象的创建CPU和主板的方法,这个抽象工厂就相当于一个抽象的装机方案,在这个装机方案里面,各个配件是能够相互匹配的。
每个装机的客户,会提出他们自己的具体装机方案,或者是选择已有的装机方案,相当于为抽象工厂提供了具体的子类,在这些具体的装机方案类里面,会创建具体的CPU和主板实现对象。
3.理解抽象工厂模式
3.1 认识抽象工厂模式
1.模式的功能
抽象工厂的功能是为一系列相关对象或相互依赖的对象创建一个接口。从某种意义上看,抽象工厂其实是一个产品系列,或者是产品簇。
2.实现成接口
AbstractFactory在Java中通常实现成为接口,大家不要被名称误导了,以为是实现成为抽象类
3.使用工厂方法
AbstractFactory定义了创建产品所需要的接口,具体的实现是在实现类里
面,通常在实现类里面就需要选择多种更具体的实现,所以AbstractFactory定义的创建产品的方法可以看成是工厂方法,而这些工厂方法的具体实现就延迟到了具体的工厂里面。也就是说使用工厂方法来实现抽象工厂。
4.切换产品簇
抽象工厂定义了一个产品簇,因此切换产品簇的时候提供不同的抽象工厂就好了
5.抽象工厂模式的调用顺序示意图
3.2 定义可扩展的工厂
在前面的示例中,抽象工厂为每一种它能创建的产品对象都定义了相应的方法,比如创建CPU的方法和创建主板的方法等。
这种实现有一个麻烦,就是如果在产品簇中要新增加一种产品,比如现在要求抽象工厂除了能够创建CPU和主板外,还要能够创建内存对象,那么就需要在抽象工厂里面添加创建内存的这么一个方法。当抽象工厂一发生变化,所有的具体工厂实现都要发生变化,这非常的不灵活。
现在有一种相对灵活,但是不太安全的改进方式来解决这个问题,思路如下:抽象工厂里面不需要定义那么多方法,定义一个方法就可以了,给这个方法设置一个参数,通过这个参数来判断具体创建什么产品对象;由于只有一个方法,在返回类型上就不能是具体的某个产品类型了,只能是所有的产品对象都继承或者实现的这么一个类型,比如让所有的产品都实现某个接口,或者干脆使用 Object类型。
3.3 抽象工厂模式和DAO
3.3.1 DAO知识回顾
1.DAO:数据访问对象,是Data Access Object首字母的简写
2.DAO是JEE(也称JavaEE,原J2EE)中的一个标准模式,通过它来解决访问数据对象所面临的一系列问题,比如:数据源不同、存储类型不同、访问方式不同、供应商不同、版本不同等等,这些不同会造成访问数据的实现上差别很大。
3.使用DAO的系统结构图
4.DAO需要抽象和封装所有对数据的访问,DAO承担和数据仓库交互的职责,这也意味着,访问数据所面临的所有问题,都需要DAO在内部来自行解决
3.3.2 DAO和抽象工厂的关系
在实现DAO模式的时候,最常见的实现策略就是使用工厂的策略,而且多是通过抽象工厂模式来实现,当然在使用抽象工厂模式来实现的时候,可以结合工厂方法模式。因此DAO模式和抽象工厂模式有很大的联系。
3.3.3 DAO模式采用工厂方法模式来实现的策略
3.3.4 DAO模式采用抽象工厂模式来实现的策略
3.4 抽象工厂模式的优缺点
- 分离接口和实现
- 使得切换产品簇变得容易
- 不太容易扩展新的产品
- 容易造成类层次复杂
4.思考抽象工厂模式
4.1 抽象工厂模式的本质
抽象工厂模式的本质是:选择产品簇的实现
4.2 何时选用
- 1)如果希望一个系统独立于它的产品的创建,组合和表示的时候,换句话说,希望一个系统只是知道产品的接口,而不关心实现的时候
- 2)如果一个系统要由多个产品系列中的一个来配置的时候,换句话说,就是可以动态的切换产品簇的时候
- 3)如果要强调一系列相关产品的接口,以便联合使用它们的时候