一、概念
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
一个 Builder 类会一步一步构造最终的对象。该 Builder 类是独立于其他对象的。
类图:
二、作用
意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
三、优、缺点
优点:
-
多个可变参数
-
客户端代码可读性非常强
缺点:
- 增加代码量
- 构建对象必须先创建它的构造器
四、例子
public class Cat{
private final String name; //名称
private final String sex; //性别
private final int age; //年龄
private final String breed; //品种
private final float weight; //体重
private final float height; //身高
private Cat(Builder builder) { //私有构造方法,入参为内部类对象
name = builder.name;
sex = builder.sex;
age = builder.age;
breed = builder.breed;
weight = builder.weight;
height = builder.height;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
", breed='" + breed + '\'' +
", weight=" + weight +
", height=" + height +
'}';
}
public abstract class BaseBuilder{}
public static class Builder extends BaseBuilder{
private final String name; //名称
private String sex; //性别
private int age; //年龄
private String breed; //品种
private float weight; //体重
private float height; //身高
public Builder(String name) {
this.name = name;
}
/**
* 同名方法,返回this,即builder对象,链式编程
*
* @param sex
* @return
*/
public Builder sex(String sex) {
this.sex = sex;
return this;
}
public Builder age(int age) {
this.age = age;
return this;
}
public Builder breed(String breed) {
this.breed = breed;
return this;
}
public Builder weight(float weight) {
this.weight = weight;
return this;
}
public Builder height(float height) {
this.height = height;
return this;
}
/**
* build方法,构造Cat对象,也是一种单例模式的使用方式
*
* @return
*/
public Dog build() {
return new Dog(this);
}
}
}
client部分:
public class Client {
public static void main(String args[]) {
Cat cat =new Cat.Builder("Tom").age(12).build();
}
}
当类具有多个参数,设计这种类时,builder模式就是种不错的选择,特别是当大多数参数都是可选的时候。这样的设计既保证我们的类具有不可变性质,也同时具有良好的可读性。