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();
	}
}

运行输出:

相关推荐
金銀銅鐵1 分钟前
[Java] 用 GUI 展示 EnumSet 增减元素时的内部变化(下)
java·后端·ai编程
AI人工智能+电脑小能手13 分钟前
一次请求打几个下游,这个Java并行任务工具类6个方法按序聚合
java·线程池·并发编程·1024程序员节·批量处理·并行任务
paopaokaka_luck2 小时前
心理咨询管理系统(WebSocket实时沟通、基于用户的协同过滤、 ECharts多维分析、 预约业务流程、预约校验与定时处理)
java·vue.js·spring boot·mysql·spring·echarts·1024程序员节
2301_32241428042 小时前
springboot农产品交易平台的设计与实现08055-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·spring boot·redis·mysql·tomcat·maven·mybatis
考虑考虑3 小时前
JDK26的JEP 500属性
java·后端·java ee
LMT流氓兔3 小时前
第五单元——第十二课:把脚本整理成项目
java·数据库·python·langchain·1024程序员节
yuniko-n3 小时前
【JUC】四种内存屏障示例
java·1024程序员节
念何架构之路5 小时前
Go reflect 包:结构体反射 —Field、Tag 与 VisibleFields
java·数据库·golang
liangbo75 小时前
03-JDK 10/11 局部变量推断与 LTS:var 到底该怎么用
java
Percep_gan6 小时前
调用天翼云的对象存储ZOS,很详细
java·1024程序员节