提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
建造者模式
前言
建造者模式用百度百科的解释是:“建造者模式是设计模式的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。”通俗点讲,建造者模式是根据不同参数生成一个class的不同对象,属于创建型设计模式。
一、为什么要用建造者模式
现在有这样一个场景,需要构建一个复杂对象时,存在多个属性需要初始化,同时,需要对属性的初始值做一些校验。我们首先想到的方法是通过构造函数来初始化对象,并在构造函数中进行相关的逻辑校验,当属性值多个的情况下,构造函数的参数列表会变得很长,代码在可读性和易用性上都会变差。第二种方法是将必须的属性放在构造函数中,其它属性通过set()方法设置,这种方式看起来可行度高,但是当我们希望对象在创建好之后,就不能再修改内部的属性值,那么就不能对外暴露出set()方法。由此引出建造者模式,能够很好地解决上面提到的问题。下面通过一个简单例子来带你理解!
二、建造者模式简单DEMO
1.情景介绍
现在需要创建一个电脑类,电脑里面有cpu、显卡、硬盘、显示器、键盘、鼠标等等属性,并且cpu和显卡、cpu和硬盘之间需要满足一定的匹配性,电脑才能组装成功。这个例子就很适合建造者模式,根据不同参数生成一个class的不同对象。
2.具体代码
public class PcBuildConfig {
private String name;
private int cpuFrequence;
private int gpuFrequence;
private int diskSize;
private PcBuildConfig(Builder builder) {
this.name = builder.name;
this.cpuFrequence = builder.cpuFrequence;
this.gpuFrequence = builder.gpuFrequence;
this.diskSize = builder.diskSize;
}
//我们将Builder类设计成了PcBuildConfig的内部类
public static class Builder {
private static final int DEFAULT_CPU_FREQUENCE = 8;
private static final int DEFAULT_GPU_FREQUENCE = 8;
private static final int DEFAULT_DISK_SIZE = 0;
private int cpuFrequence = DEFAULT_CPU_FREQUENCE;
private int gpuFrequence = DEFAULT_GPU_FREQUENCE;
private int diskSize = DEFAULT_DISK_SIZE;
private String name;
public PcBuildConfig build() {
// 校验逻辑放到这里来做,包括必填项校验、依赖关系校验、约束条件校验等
// 假设cpu的频率需要大于gpu的频率
if (cpuFrequence < gpuFrequence) {
throw new IllegalArgumentException("...");
}
// 假设cpu的频率需要大于一定的磁盘容量
if (cpuFrequence < (diskSize/50)) {
throw new IllegalArgumentException("...");
}
return new PcBuildConfig(this);
}
public Builder setName(String name) {
this.name = name;
return this;
}
public Builder setCpuFrequence(int cpuFrequence) {
if (cpuFrequence <= 0) {
throw new IllegalArgumentException("...");
}
this.cpuFrequence = cpuFrequence;
return this;
}
public Builder setGpuFrequence(int gpuFrequence) {
if (gpuFrequence < 0) {
throw new IllegalArgumentException("...");
}
this.gpuFrequence = gpuFrequence;
return this;
}
public Builder setDiskSize(int diskSize) {
if (diskSize < 0) {
throw new IllegalArgumentException("...");
}
this.diskSize = diskSize;
return this;
}
}
public static void main(String[] args) {
PcBuildConfig config = new PcBuildConfig.Builder()
.setName("我的电脑")
.setCpuFrequence(16)
.setGpuFrequence(10)
.setDiskSize(500)
.build();
System.out.println(config.toString());
}
}
总结
建造者模式主要是用来创建一种类型的复杂对象,可以通过设置不同的可选参数,定制化地创建不同的对象。相比于构造函数或者直接使用set()方法来进行属性赋值,更加高效;但是,如果对象内部变化频繁复杂,则不适合使用建造者模式。