03-建造模式Quarkus实现

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

1 基础知识
1.1 标准定义
建造模式标准定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
1.2 分析和说明
建造模式属于创建性模式,它就是将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。建造模式就是解决这类问题的一种思想方法——将一个复杂对象的构建与它的表示分离.使得同样的构建过程可以创建不同的表示。Builder结构如图1所示。
Builder角色包括抽象建造者(Builder)角色、具体建造者(Concrete Builder)角色、导演者(Director)角色和产品(Product)角色。 在这里插入图片描述
图1 建造模式结构
抽象建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,以接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(Concrete Builder)角色。具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法;另一种是结果返还方法。一般来说,产品所包含的部件数目与建造方法的数目相符。换言之,有多少部件,就有多少相应的建造方法。
具体建造者(Concrete Builder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例。这个角色要完成的任务包括:实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作。在建造过程完成后,提供产品的实例。
导演者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色。
产品(Product)角色:产品(Product)便是建造中的复杂对象。一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。

2 应用场景举例
比如公司要做一个软件项目,该软件项目由可行性研究、技术交流、投标、签订合同、需求调研、系统设计、系统编码、系统测试、系统部署和实施、系统维护等多个过程组成。但是对于不同的项目,有不同的过程组成。如对于非投标项目ProjectA,只有需求调研、系统设计、系统编码、系统测试、系统部署和实施、系统维护等过程。就可以采用Builder模式。用例如图2所示。 在这里插入图片描述
图2 建造模式的用例图
AbstractProjectProcessBuilder可以理解为抽象建造者(Builder)角色,ConcreteProjectProcessBuilder可以理解为实现抽象建造者(Builder)角色的具体建造者(Concrete Builder)角色。ProjectA可以理解为导演者(Director)角色和产品(Product)角色的结合。其实现类图如图3所示。 在这里插入图片描述
图3 建造模式的类图
建造模式实现的顺序图如图4所示,实现顺序描述:① 创建一个builder实例对象;② 创建一个project1实例对象,并把builder实例对象赋值给project1对象;③ 获得project1对象;④ 对project1对象的项目过程进行构造,即调用其construct方法;⑤ 显示project1里面的项目过程。 在这里插入图片描述
图4 建造模式的顺序图

3.Quarkus的实现程序代码
Quarkus程序实现主要包括AbstractProjectProcessBuilder抽象类文件,ConcreteProjectProcessBuilder类文件和ProductA类文件等3个文件。其关系如图3所示。下面分别列出这3个文件的程序代码,最后列出测试代码并显示输出结果。
AbstractProjectProcessBuilder为抽象建造者(Builder)角色,其类程序代码清单01所示。
程序代码清单01

public abstract class AbstractProjectProcessBuilder {	
	List<String> processList = new ArrayList<String>();
	//可行性分析过程
	public void buildFeasibility(){};
	//技术交流过程
	public void buildTechnicalDiscussion(){};
	//投标过程
	public void buildBid(){};
	//需求调研和分析过程
	public void buildRequirement(){};
	//设计过程
	public void buildDesign(){};
	//编码过程
	public void buildProgram(){};
	//测试过程
	public void buildTest(){};
	//部署和实施过程
	public void buildDeployment(){};
	//维护过程
	public void buildMaintenance(){};
	
	public void showProcess(){
		for (int i=0; i<processList.size(); i++){
			System.out.print(processList.get(i) + "  ");
			System.out.println();
		}		
	}
}

ConcreteProjectProcessBuilder为具体建造者(Concrete Builder)角色,其类程序代码清单02所示。
程序代码清单02

@ApplicationScoped
public class ConcreteProjectProcessBuilder extends
		AbstractProjectProcessBuilder {

	// 可行性分析过程
	public void buildFeasibility() {
		processList.add("可行性分析过程");
	}

	// 技术交流过程
	public void buildTechnicalDiscussion() {
		processList.add("技术交流过程");
	}

	// 投标过程
	public void buildBid() {
		processList.add("投标过程");
	}

	// 需求调研和分析过程
	public void buildRequirement() {
		processList.add("需求调研和分析过程");
	}

	// 设计过程
	public void buildDesign() {
		processList.add("设计过程");
	}

	// 编码过程
	public void buildProgram() {
		processList.add("编码过程");
	}

	// 测试过程
	public void buildTest() {
		processList.add("测试过程");
	}

	// 部署和实施过程
	public void buildDeployment() {
		processList.add("部署和实施过程");
	}

	// 维护过程
	public void buildMaintenance() {
		processList.add("维护过程");
	}
}

ProjectA为导演者(Director)角色和产品(Product)角色的结合,ProjectA的类程序代码清单03所示。
程序代码清单03

@ApplicationScoped
public class ProjectA {
	
	private AbstractProjectProcessBuilder projectBulider;
	public ProjectA(AbstractProjectProcessBuilder  builder){
		projectBulider = builder;
	}
	
	public void setBuilder(AbstractProjectProcessBuilder  builder){
		projectBulider = builder;
	}
	
	public void Construct(){
		projectBulider.buildRequirement();
		projectBulider.buildDesign();
		projectBulider.buildProgram();
		projectBulider.buildTest();
		projectBulider.buildDeployment();
		projectBulider.buildMaintenance();
	}
	
	public void showProcess(){
		projectBulider.showProcess();		
	}
}

建造模式测试程序的代码清单04如下:
程序代码清单04

public class BuilderClient implements QuarkusApplication{	
	
	@ConfigProperty(name = "gof23.creationalpattern.builder.title", defaultValue = "gof23")
	String title;
	
	@Inject
	ConcreteProjectProcessBuilder bulider;
	
	@Inject
	ProjectA project1;
	
	@Override
    public int run(String... args) {		
		System.out.println("——————" + title + "演示输出————————");	
		
		project1.Construct();
		project1.showProcess();
        return 0;
    }    
	
	public static void main(String... args) {		
		Quarkus.run(BuilderClient.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\builder”目录中。
同时也可以从gitee上clone预先准备好的示例代码,命令如下:

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

参考文献

[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] 孔金金 顾春华. 设计模式对领域驱动设计的支持及其应用. 计算机与现代化,2008.(11),46-49,53.
[7] 非鱼. 理解设计模式3——生成器(Builder). Internet信息世界,2002.(1),87-88.
[8] 郭庆华 刘镰斧. 设计模式在网元管理系统的应用. 福建电脑,2005.(12),31-31,22.
[9] 马辉. Asp.net中使用生成器模式和XML实现定制查询. 天津科技,2005.32(4),39-41.
[10] 沈建 雷航 石浩鸿. 设计模式在光传输网管系统中的应用研究. 计算机技术与发展,2007.17(3),231-232,235.
[11] 王晓波 蔡汉明 王军 崔慧敏. 设计模式在线切割CAD软件开发中的应用. 机电工程技术,2006.35(2),44-47.
[12] Quarkus官网. https://quarkus.io/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值