设计模式---抽象工厂模式
来源:互联网 发布:淘宝客地推海报 编辑:程序博客网 时间:2024/05/20 10:10
前面学习了简单工厂模式,工厂方法模式,并且通过实例知道了他们的应用情景和优缺点。于此回顾一下:
简单工厂模式:
一个工厂负责所有类的对象的创建,不支持无缝的新增类的类型对象的创建,不符合高内聚的
原则.(可以通过反射机制)改良一下。
工厂方法模式:
多个工厂负责多个产品对象的创建,每个工厂只负责具体类型对象的创建,支持无缝新增类型
对象的创建,符合高内聚原则,需要实现工厂接口类和产品接口类。但是,会照成工厂类太多,难以维护.
既然知道了简单工厂模式,工厂方法模式的一些不足,如何进行改进、克服呢?这就要使用抽象工厂模式
了。
通过前面的学习,我们知道每一个设计模式都是针对一定问题的解决方案,工厂方法模式针对的是一个
产品等级结构,而抽象工厂模式则针对的是多个产品等级结构。
在学习抽象工厂模式之前首先要理解产品族的概念:
所谓产品族,是指位于不同的产品等级结构,功能相关联的产品家族。如图:
由图可以看出,图中一共有三个产品族,分布于三个不同的产品结构中。若要确定一个产品则必须指明
它所在的产品族和所处的等级结构。
所谓的抽象工厂模式就是处于工厂等级结构中的一个具体的工厂,可以创建出分属于不同产品结构的
一个产品族的所有的对象。如上图所示。从这点就可以看出抽象工厂和工厂方法模式的区别所在了,工厂
方法模式的具体工厂类只能创建一个对象,而抽象工厂模式可以创建多个对象。
那么,抽象工厂模式到底是如何工作的呢?首先看看其类图结构吧。
类图中所描述的产品族结构可以表示如下:
那么抽象工厂有哪些角色组成呢?其实抽象工厂模式和工厂方法模式的组成角色类似,只是各个角色具体完成
的功能可能会略有区别而已。角色组成及作用如下:
抽象工厂角色:
是模式的核心部分,与应用程序的逻辑是无关的。
具体工厂角色:
用于创建产品的实例,并且含有如何创建该产品对象的逻辑,与应用程序功能密切相关。
抽象产品角色:
具体工厂所能创建的对象的父类,或则是他们共同拥有的接口。
具体产品角色:
真正的完成应用程序的逻辑功能的部分,继承或实现抽象产品角色。
看一下例子程序代码:(根据的上面的类结构图,个命名并没有实际含义)
抽象工厂类:
package com.kiritor;/**抽象工厂类*/public interface AbstractFactory { public AbstractProductA createProductA(); public AbstractProductB createProductB();}具体工厂类:
package com.kiritor;/**用于创建一号类型的产品族的工厂*/public class Factory1 implements AbstractFactory {@Overridepublic AbstractProductA createProductA() {// TODO Auto-generated method stubreturn new ProductA1();}@Overridepublic AbstractProductB createProductB() {// TODO Auto-generated method stubreturn new ProductB1();}}/**用于创建二号类型的产品族的工厂*/package com.kiritor;public class Factory2 implements AbstractFactory{@Overridepublic AbstractProductA createProductA() {// TODO Auto-generated method stubreturn new ProductA2();}@Overridepublic AbstractProductB createProductB() {// TODO Auto-generated method stubreturn new ProductB2();}}抽象产品:
package com.kiritor;/**抽象产品*/public abstract class AbstractProductA { private String name ; public String getName() { return this.name; }}package com.kiritor;/**抽象产品*/public abstract class AbstractProductB {private String name;public String getName() {return name;}}具体产品:
package com.kiritor;public class ProductA1 extends AbstractProductA{}package com.kiritor;public class ProductA2 extends AbstractProductA{}package com.kiritor;public class ProductB1 extends AbstractProductB{}package com.kiritor;public class ProductB2 extends AbstractProductB{}通过实例代码,可以看到工厂方法模式和抽象方法模式有很多地方相同的,只是在具体工厂的实现上
不同 ,那么两者的区别组要是什么呢?
理解了上述代码结构不难发现,工厂方法模式可以看成是抽象方法模式的一种特例,工厂方法模式是创建
一个产品结构的,而抽象工厂模式是用来创建多个产品结构的。一般说来工厂方法只有一个产品抽象类,而抽
象工厂有多个产品抽象类。工厂方法模式中的工厂具体类只能创建一类产品类对象,而抽象工厂模式的具体工
厂可以创建多个产品类的实例。
- 抽象工厂设计模式
- 设计模式-----抽象工厂
- 抽象工厂设计模式
- 抽象工厂设计模式
- 抽象工厂设计模式
- 设计模式 抽象工厂
- 设计模式--抽象工厂
- 设计模式--抽象工厂
- 设计模式 抽象工厂
- 设计模式-抽象工厂
- 设计模式-> 抽象工厂
- 抽象工厂设计模式
- 设计模式--抽象工厂
- 【设计模式】抽象工厂
- 设计模式---抽象工厂
- 【设计模式-抽象工厂】
- 设计模式-抽象工厂
- 设计模式--抽象工厂
- Emacs使用Projectile管理项目,可快速访问项目里任何文件,支持全项目关键词搜索
- final修饰类、修饰方法、修饰变量时作用
- gbs使用手册之gbs build
- 指针赋值的问题
- linux出现Cannot set LC_CTYPE to default locale: No such file or directory错误的解决办法
- 设计模式---抽象工厂模式
- T-SQL查询进阶--深入浅出视图
- struts1总结——优缺点
- ZOJ 1610 Count the Colors 线段树 染色问题
- 【强连通】Victoria的舞会2 -- Vijos 1022,1023
- activity全屏设置
- 2013 C++第一周任务-成绩问题(结构体)
- Windows XP系统下架设FTP服务器实例详解
- python打开带有目录的文件的注意事项