共计 2080 个字符,预计需要花费 6 分钟才能阅读完成。
内容目录
建造者模式
概述
建造者(Builder)模式用于创建过程稳定,但配置多变的对象。其定义是:将一个复杂的构建与其表示相分离,使得同样的构造过程可以创建不同的表示。
类型
建造者模式属于创建型模式。
介绍
- 目的:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
- 主要解决:解决在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,复杂对象的各个部分经常面临剧烈的变化,但是将它们组合在一起的算法确是相对稳定的。
- 使用场景:当一个对象的创建其一些基本的部件不变,而组合经常发生变化时。
- 解决方案:使用链式调用来生成不同的配置。
- 注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
示例代码
传统的“建造者-指挥者”模式现在已经不太常用了,现在的建造者模式主要是通过链式调用
来生成不同的配置。这里我们以制作一杯珍珠奶茶MilkTea为例,进行说明。
MilkTea类
package builder;
import iterator.Book;
public class MilkTea {
// 对象的配置参数
private String type;
private String size;
private boolean pearl;
private boolean ice;
public String getType(){
return type;
}
public String getSize(){
return size;
}
public boolean getPearl(){
return pearl;
}
public boolean getIce(){
return ice;
}
@Override
public String toString() {
return "MilkTea{" +
"type='" + type + '\'' +
", size='" + size + '\'' +
", pearl=" + pearl +
", ice=" + ice +
'}';
}
// 将构造方法设置为私有,外部就不能通过new构建出该实例
private MilkTea(){}
private MilkTea(Builder builder){
this.type = builder.type;
this.ice = builder.ice;
this.pearl = builder.pearl;
this.size = builder.size;
}
// 通过内部类Builder构建
public static class Builder{
private final String type;
private String size = "中杯";
private boolean pearl = true;
private boolean ice = false;
// 对于必要的配置,可以通过Builder构造方法传入
public Builder(String type){
this.type = type;
}
// 其它可选配置通过链式调用,若不配置,则使用默认配置
public Builder size(String size){
this.size = size;
// 链式调用实现的关键
return this;
}
public Builder pearl(boolean pearl){
this.pearl = pearl;
return this;
}
public Builder ice(boolean ice){
this.ice = ice;
return this;
}
// 该方法就会创建一个对象并返回
public MilkTea build(){
return new MilkTea(this);
}
}
}
在上述代码中可以看到,我们将 MilkTea 的构造方法设置为私有的,所以外部不能通过 new 构建出 MilkTea 实例,只能通过 Builder 构建。对于必须配置的属性,通过 Builder 的构造方法传入,可选的属性通过 Builder 的链式调用方法传入,如果不配置,将使用默认配置,也就是中杯、加珍珠、不加冰。
测试代码如下:
package builder;
import org.junit.Test;
public class BuilderTest {
@Test
public void builderTest(){
MilkTea pearl = new MilkTea.Builder("原味")
.size("中杯")
.ice(true)
.pearl(true)
.build();
System.out.println(pearl.toString());
}
}
其它
这里介绍的Builder模式并非传统经典的Builder模式,而是适用于Java、最常用的Builder模式,该模式是通过内部类实现链式调用进行创建的,在这里,链式调用更为优雅、清晰、一目了然,一行代码就完成了对象创建,避免了多行代码赋值过程出错,同时也省去了大量冗余的变量,避免变量复制出错。
该模式在很多优秀的Java开源框架出现过,例如okHttp、Spring生态、Retrofit等等。
正文完