设计模式之建造者模式

简介

建造者模式是一种创建型设计模式,将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示,该模式适用于创建具有复杂内部结构的对象,特别是当对象的组成部分不变但组合方式经常变化时

平时,如果我们需要创建一个对象,通常使用new 的方式,传参进入构造函数中调用字段的set方法或直接通过对象.set方法来创建对象的字段细节,这种方式对于简单对象使用没什么问题,但对于一个对象中动辄几十个字段以上的对象来说,这就太麻烦了, 并且由于业务的复杂程度,对象内部字段的组合也是千变万化,使得需要定义特别多的构造函数,或在代码中进行set,容易错漏,并且不够优雅

传统方式:构造函数爆炸

传统方式:setter方法(对象状态可能不一致)

静态内部建造者

静态内部建造者方式是一种非常简单并且简洁的建造者模式,有利于我们理解建造者模式,我们创建一个Computer 类,将cpu,memory,storage三个字段由private final修饰,这样可以确保对象创建之后外部无法直接访问和修改字段(即便有set方法也没用,demo中有举例),然后将构造方法私有化,防止客户端直接实例化对象,确保只能通过建造者创建,最后再创建一个静态内部建造者Builder ,此时我们就可以在建造者Builder中构建具体的部件,实例化时new Computer.Builder()后根据链式编程逐步完善细节,这样一来,我们可以将复杂的构建逻辑或者检验等封装到在Builder中统一处理,修改构建逻辑只需调整建造者类

java 复制代码
// 产品类 - 电脑
 class Computer {
	private final String cpu;
	private final String memory;
	private final String storage;

	// 私有构造函数,只能通过建造者创建
	private Computer(Builder builder) {
		this.cpu = builder.cpu;
		this.memory = builder.memory;
		this.storage = builder.storage;
	}

	// 静态内部建造者类
	public static class Builder {
		private String cpu;
		private String memory;
		private String storage;

		public Builder setCpu(String cpu) {
			this.cpu = cpu;
			return this;
		}

		public Builder setMemory(String memory) {
			this.memory = memory;
			return this;
		}

		public Builder setStorage(String storage) {
			this.storage = storage;
			return this;
		}

		public Computer build() {
			return new Computer(this);
		}
	}

	// Getter方法
	public String getCpu() { return cpu; }
	public void setCpu(String cpu) { return cpu; }
	public String getMemory() { return memory; }
	public String getStorage() { return storage; }

	@Override
	public String toString() {
		return "Computer [CPU: " + cpu + ", Memory: " + memory + ", Storage: " + storage + "]";
	}
}


// 演示类
 class BuilderPatternDemo {
	public static void main(String[] args) {
		// 使用建造者创建电脑对象
		Computer gamingComputer = new Computer.Builder()
				.setCpu("Intel i9")
				.setMemory("32GB DDR5")
				.setStorage("2TB NVMe SSD")
				.build();

		Computer officeComputer = new Computer.Builder()
				.setCpu("Intel i5")
				.setMemory("16GB DDR4")
				.setStorage("512GB SSD")
				.build();

		System.out.println("游戏电脑配置: " + gamingComputer);
		System.out.println("办公电脑配置: " + officeComputer);

		//由于字段被final修饰,即便给出set方法进行设置,也无法改变
		officeComputer.setCpu("00.1纳米");
		System.out.println("办公电脑配置,重新设置CPU值为00.1纳米之后: " + officeComputer);
		System.out.println("由于字段被final修饰,无法更改");
	}
}

常规建造者模式:

现在我们来看上面的改造为常规建造者模式后的代码,实际上就是将Computer 类中的静态建造者提了出来成为单独的建造类,依然承担主要建造责任,依然封装具体建造细节,在此基础上,还可以将建造类改造为抽象接口,定义抽象建造方法,然后由多个具体建造类实现,从而实现进一步扩展

java 复制代码
// 产品类 - 电脑
class Computer {
	private final String cpu;
	private final String memory;
	private final String storage;

	// 公有构造函数,接受建造者对象
	public Computer(ComputerBuilder builder) {
		this.cpu = builder.cpu;
		this.memory = builder.memory;
		this.storage = builder.storage;
	}

	// Getter方法
	public String getCpu() { return cpu; }
	public String getMemory() { return memory; }
	public String getStorage() { return storage; }

	@Override
	public String toString() {
		return "Computer [CPU: " + cpu + ", Memory: " + memory + ", Storage: " + storage + "]";
	}
}

// 独立的建造者类
class ComputerBuilder {
	protected String cpu;
	protected String memory;
	protected String storage;

	public ComputerBuilder setCpu(String cpu) {
		this.cpu = cpu;
		return this;
	}

	public ComputerBuilder setMemory(String memory) {
		this.memory = memory;
		return this;
	}

	public ComputerBuilder setStorage(String storage) {
		this.storage = storage;
		return this;
	}

	public Computer build() {
		return new Computer(this);
	}
}
// 演示类
 class BuilderPatternDemo {
	public static void main(String[] args) {
		// 使用独立的建造者类创建电脑对象
		ComputerBuilder builder = new ComputerBuilder();

		Computer gamingComputer = builder
				.setCpu("Intel i9")
				.setMemory("32GB DDR5")
				.setStorage("2TB NVMe SSD")
				.build();

		Computer officeComputer = new ComputerBuilder()
				.setCpu("Intel i5")
				.setMemory("16GB DDR4")
				.setStorage("512GB SSD")
				.build();

		System.out.println("游戏电脑配置: " + gamingComputer);
		System.out.println("办公电脑配置: " + officeComputer);

		// 验证配置信息
		System.out.println("游戏电脑CPU: " + gamingComputer.getCpu());
		System.out.println("办公电脑内存: " + officeComputer.getMemory());
	}
}

建造者模式与工厂模式的区别:

‌工厂模式 :好比一个汽车品牌(如丰田)的4S店‌

你去丰田4S店说:"我要买一辆凯美瑞。"

销售员回答:"好的。"

过了一会儿,他直接交给你一辆‌标准配置、组装完毕‌的凯美瑞汽车。

‌特点‌:你关注的是‌最终产品‌(一辆凯美瑞)。你不需要关心这辆车是怎么组装起来的(是先装发动机还是先装车门),你只告诉工厂你想要什么型号,它就给你一个完整的、标准化的产品。
‌核心‌:‌生产产品‌。

‌建造者模式 :好比一个高端汽车定制工坊‌

你去劳斯莱斯定制中心说:"我要造一辆幻影。"

然后你和工程师(建造者)一步步确定细节:

工程师问:"车身要什么颜色?" 你答:"曜石黑。"

工程师问:"内饰要真皮还是天鹅绒?" 你答:"牛津真皮。"

工程师问:"轮毂要20寸还是22寸?" 你答:"22寸锻造轮毂。"

工程师问:"要星空顶吗?" 你答:"要。"

工程师根据你的每一步选择,逐步将这辆幻影搭建起来。最终,你得到了一辆‌完全按照你的个性化规格‌组装起来的劳斯莱斯幻影。

‌特点‌:你关注的是‌建造过程‌和‌细节配置‌。你通过一系列步骤和选择,指导建造者如何创建这个复杂对象。同一个建造过程(造幻影),因为配置不同,会产出不同的最终产品。
‌核心‌:‌组装产品‌。


上一篇 >>>>> 设计模式之工厂模式

看千遍想万遍,还得动手练一练,量变才能产生质变

相关推荐
不脱发的程序猿3 小时前
如何检测和解决I2C通信死锁
stm32·单片机·嵌入式·1024程序员节
wbs_scy3 小时前
C++类和对象(中):const 成员函数与取地址运算符重载
1024程序员节
CodeLongBear3 小时前
帝可得智能售货机系统实战Day1:从环境搭建到区域管理功能落地 (1)
java·1024程序员节·ai + 若依框架
Lansonli3 小时前
大数据Spark(七十):Transformation转换算子cogroup和zip使用案例
1024程序员节
白鹿第一帅3 小时前
星光不负 码向未来|我的HarmonyOS学习之路与社区成长故事
1024程序员节
易ლ拉罐3 小时前
【计算机网络】HTTP协议(二)——超文本传输协议
网络·计算机网络·http·1024程序员节
Daniel_Coder4 小时前
iOS Widget 开发-8:手动刷新 Widget:WidgetCenter 与刷新控制实践
ios·swift·widget·1024程序员节·widgetcenter
清风徐来Groot4 小时前
WPF绘制界面常用功能
1024程序员节
MeowKnight9584 小时前
【C】函数指针
c语言·1024程序员节