java设计模式-建造者(Builder)设计模式

介绍

Java的建造者(Builder)设计模式可以将产品的内部表现和产品的构建过程分离开来,这样使用同一个构建过程来构建不同内部表现的产品。

建造者设计模式涉及如下角色:

  • 产品(Product)角色:被建造的复杂对象。对象包括了多个部分,这些部分有可能有顺序关系,需要按照一定的顺序来创建。
  • 抽象构建者(Builder)角色:定义了构建产品各部分的接口,一般产品中的每个部分对应一个接口。另外,还提供返回产品的接口。抽象构建者跟具体的业务逻辑无关。
  • 具体构建者(Concrete Builder)角色:实现抽象构建者的接口,跟具体的业务逻辑相关,完成具体产品各部分的构建。如果要构建的不同产品包含的部件数量不完全相同,那也可以在抽象构建者角色中定义一套全的接口,但在具体构建者角色中对产品没有的那部分部件的构建接口实现为空。
  • 导演者(Diretor)角色:直接和客户端打交道,调用具体构建者角色创建具体的产品。

代码示例

定义一个产品:

package com.thb;

public class Packet {

	private String header;
	private String content;
	private int contentLength;
	
	public void setHeader(String header) {
		this.header = header;
	}
	
	public void setContent(String content) {
		this.content = content;
	}
	
	public void setContentLength() {
		this.contentLength = content.length();
	}
	
	public void showSummary() {
		System.out.println("header: " + this.header);
		System.out.println("content: " + this.content);
		System.out.println("contentLength: " + this.contentLength);
	}
}

定义抽象构建者:

package com.thb;

public abstract class Builder {
	
	protected Packet packet;
	
	public Builder() {
		this.packet = new Packet();
	}

	public abstract void builidHeader();
	public abstract void builidContent();
	
	public void builidContentLength() {
		this.packet.setContentLength();
	}
	
	public Packet getResult() {
		return this.packet;
	}
}

定义一个具体构建者:

package com.thb;

public class HeartBeatPacketBuilder extends Builder {

	@Override
	public void builidHeader() {
		this.packet.setHeader("heartbeat header");
	}
	
	@Override
	public void builidContent() {
		this.packet.setContent("heartbeat content");
	}

}

定义另外一个具体构建者:

package com.thb;

public class RegisterPacketBuilder extends Builder {
	
	@Override
	public void builidHeader() {
		this.packet.setHeader("register header");
	}
	
	@Override
	public void builidContent() {
		this.packet.setContent("register content");
	}

}

定义导演者:

package com.thb;

public class Director {

	private Builder builder;
	
	public Packet construct(Builder builder) {
		this.builder = builder;
		
		builder.builidHeader();
		builder.builidContent();
		builder.builidContentLength();
		
		return this.builder.getResult();
	}
}

定义主类,模拟客户端调用:

package com.thb;

public class Test1 {
		
	public static void main(String[] args) {
		Director director = new Director();
		
		Builder heartBeatPacketBuilder = new HeartBeatPacketBuilder();
		Packet heartBeatPacket = director.construct(heartBeatPacketBuilder);
		heartBeatPacket.showSummary();
		
		System.out.println("------------------------------------");
		Builder registerPacketBuilder = new RegisterPacketBuilder();
		Packet registerPacket = director.construct(registerPacketBuilder);
		registerPacket.showSummary();
	}
}

运行输出:

相关推荐
qmx_0728 分钟前
HTB-Jerry(tomcat war文件、msfvenom)
java·web安全·网络安全·tomcat
为风而战36 分钟前
IIS+Ngnix+Tomcat 部署网站 用IIS实现反向代理
java·tomcat
技术无疆3 小时前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
架构文摘JGWZ6 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
拾光师6 小时前
spring获取当前request
java·后端·spring
aPurpleBerry6 小时前
neo4j安装启动教程+对应的jdk配置
java·neo4j
我是苏苏7 小时前
Web开发:ABP框架2——入门级别的增删改查Demo
java·开发语言
xujinwei_gingko7 小时前
Spring IOC容器Bean对象管理-Java Config方式
java·spring
2301_789985947 小时前
Java语言程序设计基础篇_编程练习题*18.29(某个目录下的文件数目)
java·开发语言·学习
IT学长编程7 小时前
计算机毕业设计 教师科研信息管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·毕业设计·springboot·毕业论文·计算机毕业设计选题·计算机毕业设计开题报告·教师科研管理系统