建造者(Builder
)模式,使用很多个简单的对象一步一步的构造成一个复杂的对象。将一个复杂对象的构建与表现分离,变与不变分离。提供链式调用,简单方便调用。属于创建型模式。在Android
中,最常用的就非AlertDialog
莫属了。
下面举个组装电脑的例子说明,程序员大多数会自己组装电脑,有时候帮朋友组装,为此我们可以根据朋友具体需求定制电脑,屏蔽电脑细节构建部分。这里的实现和其他的文章的参考不一样,主要是参考Android
的AlertDialog
实现。
这里我们定义了实体类Computer
,用来生成我们需要的电脑,带有CPU,主板,固态硬盘牌子的属性。同时我们内建了静态内部类Builder
,用于构造 Computer
,而且每个set
方法都会返回本身this
,用于链式调用。
public class Computer {
private String CPU;
private String mainboard;
private String SSD;
@Override
public String toString() {
return "CPU:" + CPU + " 主板:" + mainboard + " 固态硬盘:" + SSD;
}
public String getCPU() {
return CPU;
}
public void setCPU(String CPU) {
this.CPU = CPU;
}
public String getMainboard() {
return mainboard;
}
public void setMainboard(String mainboard) {
this.mainboard = mainboard;
}
public String getSSD() {
return SSD;
}
public void setSSD(String SSD) {
this.SSD = SSD;
}
public static class Builder {
private final ComputerParams params;
public Builder() {
params = new ComputerParams();
}
Builder setCPU(String make) {
params.CPU = make;
return this;
}
Builder setMainboard(String make) {
params.mainboard = make;
return this;
}
Builder setSSD(String make) {
params.SSD = make;
return this;
}
Computer build() {
Computer computer = new Computer();
params.apply(computer);
return computer;
}
}
}
在上面代码,我们可以注意到,我们定义了ComputerParams
类,用于保存Builder
设置的值,并在Builder
的build
方法进行了应用。如果未设置相关属性,我们就设置默认值。
public class ComputerParams {
String CPU;
String SSD;
String mainboard;
public void apply(Computer computer){
if (computer==null)
return;
if (CPU!=null){
computer.setCPU(CPU);
}else {
computer.setCPU("默认");
}
if (SSD!=null){
computer.setSSD(SSD);
}else {
computer.setSSD("默认");
}
if (mainboard!=null){
computer.setMainboard(mainboard);
}else {
computer.setMainboard("默认");
}
}
}
这样下来,在朋友配置电脑的时候,没有什么特殊的需求,就可以直接组装电脑,有特殊需求,也可以进行定制。达到代码复用,构建快速的特点。
public class Main {
public static void main(String[] args) {
//需要一台定制的电脑
Computer customComputer = new Computer.Builder()
.setCPU("AMD 锐龙 7 2700X")
.setMainboard("ASUS PRIME Z390-A")
.setSSD("SAMSUNG 1TB")
.build();
System.out.println(customComputer.toString());
//需要一台普通的电脑
Computer generalComputer = new Computer.Builder().build();
System.out.println(generalComputer.toString());
}
}
组装结果
CPU:AMD 锐龙 7 2700X 主板:ASUS PRIME Z390-A 固态硬盘:SAMSUNG 1TB
CPU:默认 主板:默认 固态硬盘:默认
总结
- 在一个复杂对象构建时,可以通过简单对象构建组成。实现代码的复用性、使用简洁性和灵活性。
- 建造者模式和工厂 模式其实是很类似的,只不过建造者更适合用在更复杂的对象的构建,尤其需要定制的情况下。
网友评论