Gof23种设计模式(3)——建造模式(Builder)

2020年8月6日14:05:21 评论 74

1 基础知识

1.1 标准定义

建造模式标准定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

1.2 分析和说明

建造模式属于创建性模式,它就是将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。建造模式就是解决这类问题的一种思想方法——将一个复杂对象的构建与它的表示分离.使得同样的构建过程可以创建不同的表示。Builder结构如图1所示。

Builder角色包括抽象建造者(Builder)角色、具体建造者(Concrete Builder)角色、导演者(Director)角色和产品(Product)角色。

Gof23种设计模式(3)——建造模式(Builder)

图1 建造模式结构

抽象建造者(Builder)角色:给出一个抽象接口,以规范产品对象的各个组成成分的建造。一般而言,以接口独立于应用程序的商业逻辑。模式中直接创建产品对象的是具体建造者(Concrete Builder)角色。具体建造者类必须实现这个接口所要求的两种方法:一种是建造方法;另一种是结果返还方法。一般来说,产品所包含的部件数目与建造方法的数目相符。换言之,有多少部件,就有多少相应的建造方法。

具体建造者(Concrete Builder)角色:担任这个角色的是与应用程序紧密相关的一些类,它们在应用程序调用下创建产品的实例。这个角色要完成的任务包括:实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作。在建造过程完成后,提供产品的实例。

导演者(Director)角色:担任这个角色的类调用具体建造者角色以创建产品对象。导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色。

产品(Product)角色:产品(Product)便是建造中的复杂对象。一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。

2 应用场景举例

比如公司要做一个软件项目,该软件项目由可行性研究、技术交流、投标、签订合同、需求调研、系统设计、系统编码、系统测试、系统部署和实施、系统维护等多个过程组成。但是对于不同的项目,有不同的过程组成。如对于非投标项目ProjectA,只有需求调研、系统设计、系统编码、系统测试、系统部署和实施、系统维护等过程。就可以采用Builder模式。用例如图2所示。

Gof23种设计模式(3)——建造模式(Builder)

图2 建造模式的用例图

AbstractProjectProcessBuilder可以理解为抽象建造者(Builder)角色,ConcreteProjectProcessBuilder可以理解为实现抽象建造者(Builder)角色的具体建造者(Concrete Builder)角色。ProjectA可以理解为导演者(Director)角色和产品(Product)角色的结合。其实现类图如图3所示。

Gof23种设计模式(3)——建造模式(Builder)
图3 建造模式的类图

建造模式实现的顺序图如图4所示,实现顺序描述:
①创建一个builder实例对象;
②创建一个project1实例对象,并把builder实例对象赋值给project1对象;
③获得project1对象;
④对project1对象的项目过程进行构造,即调用其construct方法;
⑤显示project1里面的项目过程。

Gof23种设计模式(3)——建造模式(Builder)

图4 建造模式的顺序图

3.Java的实现程序代码

Java程序实现主要包括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) + " ");
		}
	}
}

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

程序代码清单02

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

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 Client {

	public static void main(String[] args) {

		ConcreteProjectProcessBuilder bulider = new ConcreteProjectProcessBuilder();

		ProjectA project1 = new ProjectA(bulider);
		project1.construct();
		project1.showProcess();

	}

}

建造模式测试类输出结果如下所示:

需求调研和分析过程 设计过程 编码过程 测试过程 部署和实施过程 维护过程

参考链接

5种创建型模式:

Gof23种设计模式(1)——工厂模式(Factory Method)
Gof23种设计模式(2)——抽象工厂模式(Abstract Factory)
Gof23种设计模式(3)——建造模式(Builder)
Gof23种设计模式(4)——原型模式(Prototype)
Gof23种设计模式(5)——单例模式(Singleton)
Gof23种设计模式 —— 创建型模式总结和比较

回到总目录Gof23种设计模式(全解析)

(转载自微信公众号:架构设计模式)

素课网
  • 本文由 发表于 2020年8月6日14:05:21
  • 转载请注明:https://www.suketech.com/8795.html
设计模式:面向对象设计的六大原则 - 总结 设计模式

设计模式:面向对象设计的六大原则 – 总结

开闭原则是面向对象设计中最基础的设计原则,它指导我们如何建立稳定灵活的系统。开闭原则可能是设计模式六项原则中定义最模糊的一个了,它只告诉我们对扩展开放,对修改关闭,可是到底如何才能做到对扩展开放,对修...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: