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

运行输出:

相关推荐
有点。22 分钟前
*C++哈夫曼树与哈夫曼编码
java·c++·servlet
CRMEB系统商城1 小时前
CRMEB标准版系统(Java)v3.1正式发布
java·spring·微信小程序·php·教育电商
写后端的胖头鱼1 小时前
【高频面试题】Java 基础类型 + 包装类 + String 互相转换
java·开发语言
weixin_460443561 小时前
企业考试系统从.NET迁移到Java+Linux:数据库迁移、接口兼容与灰度切换实践
java·煤矿培训考试系统·煤矿在线考试系统·煤矿安全培训·煤矿考试系统·一人一档
香菜TTT2 小时前
Redis的哨兵机制
java·数据库·redis
withoutfear2 小时前
IntelliJ IDEA卡顿内存分配不足和索引被频繁触发问题解决办法
java·ide·intellij-idea
大圣编蚕2 小时前
Java StringWriter 详解:从入门到实战
java·开发语言·python
老苗项目实战3 小时前
Java工程师高频面试题(基于近一年的真实面试记录整理)
java·开发语言·面试·预见猿份·老苗项目实战
陈皮波比茶3 小时前
分布式任务调度xxl-job
java·分布式
XiaoYu1__4 小时前
JavaGUI文件管理系统开发实战:从静态展示到动态交互的演进
java·开发语言