02-抽象工厂模式Quarkus实现

摘要:本文用一个实例场景描述Gof 23设计模式中的抽象工厂模式,并用Quarkus框架代码给予实现,同时也给出实现代码的UML模型。
关键字:Gof 23 设计模式 抽象工厂模式 Quarkus

1 基础知识
1.1 标准定义
抽象工厂模式标准定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
1.2 分析和说明
抽象工厂模式是一个创建性的模式。与工厂方法模式一样,它要求工厂类和产品类分开。但是核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。一个具体的工厂类负责创建产品族中的各个产品。其实质就是由1个工厂类层次、N个产品类层次和N×M个产品组成。
在这里插入图片描述
图1 抽象工厂结构
Abstract Factory结构如图1所示。抽象工厂模式包括四个角色:抽象工厂角色;具体工厂类角色;抽象产品角色和具体产品角色。分别描述如下。
抽象工厂(Abstract Factory)角色:担任这个角色的是工厂方法模式的核心,它是与应用系统的商业逻辑无关的。通常使用接口或者抽象类实现,而所有的具体工厂类必须实现这个接口或继承这个抽象类。
具体工厂类(Concrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。实际应用中使用具体类来实现这个角色。
抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。通常使用接口或者抽象类来实现这一角色。
具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。实际应用中使用具体类来实现这个角色。
2 应用场景举例
比如几家公司同时能生产计算机和电话。但是计算机系列包括PC机、笔记本电脑和服务器。电话系列包括座机电话和手机。对于这种情况就可以采用抽象工厂模式。其业务用例图见图3。 在这里插入图片描述
图2 抽象工厂模式的用例图
在这里可以把Company理解为抽象工厂(Abstract Factory)角色。CompanyA和CompanyB是具体工厂(Concrete Creator)角色。Computer和Telephone是两类不同的抽象产品(Product)角色。NotebookComputer和PersonalComputer是基于Computer抽象产品的具体产品(Concrete Product)角色。DesktopPhone和Mobile是基于Telephone抽象产品的具体产品(Concrete Product)角色。其实现类图如图3所示。
在这里插入图片描述
图3 抽象工厂模式的类图
抽象工厂模式实现的顺序图如图4所示,其实现步骤描述:① 创建一个Company1对象;② 调用Company1对象buildProduct方法,实际上从Company1对象创建一个Computer产品,为PersonalComputer对象。③ 对PersonalComputer对象采取doUse方法;④⑤与②③步骤一样,不过产生的是NotebookComputer对象。⑥ 调用Company1对象buildProduct方法,实际上从Company1对象创建一个Telephone产品,为DesktopPhone对象。⑦ 对DesktopPhone对象采取doUse方法;⑧⑨与⑥⑦步骤一样,不过产生的是Mobile对象。
在这里插入图片描述
图4 抽象工厂模式实现顺序图

3.Quarkus的实现程序代码
Quarkus程序实现主要包括Company接口文件,Computer抽象类文件,Telephone抽象类文件,CompanyA类文件,CompanyB类文件,Mobile类文件、DesktopPhone类文件、NotebookComputer类文件和PersonalComputer类文件等9个文件。其关系如图3所示。下面分别列出这9个文件的程序代码,最后列出测试代码并显示输出结果。
Company属于抽象工厂(Abstract Factory)角色,Company的接口程序代码清单01所示。
程序代码清单01

public interface Company {	
	public Computer bulidComputer(String Parameter);	
	public Telephone bulidTelephone(String Parameter);	
}

Computer抽象类和Telephone抽象类属于抽象产品(Abstract Product)角色,Computer和Telephone抽象类程序代码清单02所示。
程序代码清单02

public abstract class Computer {	
	public void doUse(){}
}

public abstract class Telephone {	
	public void doUse(){}
}

CompanyA类和CompanyB类属于具体工厂类(Concrete Factory)角色,CompanyA类和CompanyB类程序代码清单03所示。
程序代码清单03

@ApplicationScoped
public class CompanyA implements Company{
	public Computer bulidComputer(String Parameter){
		if (Parameter.equals("个人电脑")) return new PersonalComputer();
		else if  (Parameter.equals("笔记本电脑")) return new NotebookComputer();
		else return null;
	}
	
	public Telephone bulidTelephone(String Parameter){
		if (Parameter.equals("座机电话")) return new DesktopPhone();
		else if  (Parameter.equals("手机")) return new Mobile();
		else return null;
	}
}

public class CompanyB implements Company{	
	public Computer bulidComputer(String Parameter){
		if (Parameter.equals("个人电脑")) return new PersonalComputer();
		else if  (Parameter.equals("笔记本电脑")) return new NotebookComputer();
		else return null;
	}
	
	public Telephone bulidTelephone(String Parameter){
		if (Parameter.equals("座机")) return new DesktopPhone();
		else if  (Parameter.equals("手机")) return new Mobile();
		else return null;
	}
}

Mobile类和DesktopPhone类属于具体产品(Concrete Product)角色,Mobile类和DesktopPhone类程序代码清单04所示。
程序代码清单04

@ApplicationScoped
public class Mobile extends Telephone {
	public void doUse(){
		System.out.println("这是手机的功能");
	}
}

public class DesktopPhone extends Telephone{
	public void doUse(){
		System.out.println("这是座机电话的功能");
	}
}

NotebookComputer类和PersonalComputer类属于具体产品(Concrete Product)角色,NotebookComputer类和PersonalComputer类程序代码清单05所示。
程序代码清单05

@ApplicationScoped
public class NotebookComputer extends Computer{
	public void doUse(){
		System.out.println("这是笔记本电脑的功能");
	}
}

public class PersonalComputer extends Computer{	
	public void doUse(){
		System.out.println("这是个人计算机的功能");
	}
}

抽象工厂模式测试程序的代码清单06如下:
程序代码清单06

@ApplicationScoped
public class AbstractfactoryClient implements QuarkusApplication {	
	
	@ConfigProperty(name = "gof23.creationalpattern.abstractfactory.title", defaultValue = "gof23")
	String title;
	
	@Inject
	CompanyA company1;

	@Override
	public int run(String... args) {	
		
		System.out.println("—————" + title + "演示输出——————————————");		
		
		Computer computer1 = company1.bulidComputer("个人电脑");
		computer1.doUse();

		Computer computer2 = company1.bulidComputer("笔记本电脑");
		computer2.doUse();

		Telephone telephone1 = company1.bulidTelephone("座机电话");
		telephone1.doUse();

		Telephone telephone2 = company1.bulidTelephone("手机");
		telephone2.doUse();

		return 0;
	}

	public static void main(String... args) {
		Quarkus.run(AbstractfactoryClient.class, args);
	}
}

抽象工厂模式测试类输出结果如下所示:

这是个人计算机的功能
这是笔记本电脑的功能
这是座机电话的功能
这是手机的功能

4. 相关Quarkus程序源码下载
可以直接从github上获取代码,读者可以从github上clone预先准备好的示例代码。

git clone https://github.com/rengang66/quarkus-sample-gof23.git

这是一个Maven项目,然后Maven导入工程。该程序位于“src\main\java\com\iiit\quarkus\sample\gof23\creationalpattern\abstractfactory”目录中。
同时也可以从gitee上clone预先准备好的示例代码,命令如下:

git clone https://gitee.com/rengang66/quarkus-sample-gof23.git

5 扩展和说明
抽象工厂模式也是应用比较广泛的设计模式。对于抽象工厂模式,从两个层次上进行扩展。
一种是从抽象工厂中继承出来的具体工厂。即上述场景中的CompanyA,CompanyB,可以根据情况在增加CompanyC、CompanyD等。
一种是对产品进行扩充。可以增加一个产品类族,如计算机、手机、再增加电视机等。还有一种是增加具体的产品。如计算机下面还可以增加服务器等。

参考文献

[1] E.Gamma, R.Helm, R.Johnson, and Vlissides. Design Patterns Elements of Reusable Object Oriented Software. Addison-Wesley, 1995
[2] E.Gamma, R.Helm, R.Johnson, and Vlissides.著,李英军等译,设计模式:可复用面向对象软件的基础,北京:机械工业出版社.2000.9.
[3] 阎宏,Java与模式,北京:电子工业出版社. 2002.10
[4] 王俊峰 戚晓滨. 设计模式和UML. 计算机应用研究,1999.16(5), 27-29,39.
[5] 陈琴 朱正强. UML在设计模式描述中的应用. 计算机工程与设计,2003.24(4), 81-84.
[6] 龚永生. 实现一个Java抽象工厂模式. 开放系统世界,2002.(10), 76-82.
[7] 吴宣为. 一种基于设计模式的动态报表设计. 微计算机信息,2007.(24), 222-223,277.
[8] 胡永久 庄成山. 抽象工厂模式与MFC文档/视图/窗口创建方式的比较. 现代计算机:下半月版,2004.(10), 21-24.
[9] 梁文娟 郑逢斌 杜莹 党兰学. 抽象工厂模式在.net多层分布式程序中的应用. 计算机时代,2006.(3), 27-29.
[10] 汤继伟 曹作良 汪秀春. 抽象工厂模式在ERP系统单据处理中的应用. 天津理工学院学报,2004.20(1), 101-103.
[11] 陈灯 王勇 徐启丰. 用抽象工厂模式实现某型飞机机载总线仿真. 计算机仿真,2003.20(12), 27-29.
[12] 顾明. 基于软件设计模式的GIS中间件描述. 计算机应用与软件,2008.25(3), 86-88.
[13] 高瑞明 吴洁明. 基于设计模式数据访问组件的设计和实现. 现代计算机:下半月版,2008.(2), 122-123.
[14] 阎小涛 刘涛 沈为群. 设计模式在航空发动机试验台测控系统中的应用. 兵工自动化,2007.26(10), 62-64.
[15] 尚鲜连. 设计模式在数据持久层设计中的应用. 重庆科技学院学报:自然科学版,2008.10(6), 108-111.
[16] 吴超. 设计模式在数据库浏览系统中的应用. 计算机工程与科学,2006.(z2), 148-149.
[17] 刘蕴珊 刘列励. 设计模式在信息系统中的应用研究. 信息技术,2008.32(10), 121-123,126.
[18] 朱晓磊 许向众. 设计模式在智能客户端软件工厂中的应用. 电脑应用技术,2008.(12), 7-13.
[19] 刘华 黄龙水 曹万华. 一种人机界面风格动态切换的实现技术. 计算机与数字工程,2006.34(2), 90-92,96.
[20] Quarkus官网. https://quarkus.io/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值