前言
建造者模式是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。创建者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加以抽象,通过子类继承或者重载的方式,动态的创建具有复合属性的对象。
建造者模式的实现
public final class House {
private String color;
private String size;
private String height;
public House(Builder builder) {
// TODO Auto-generated constructor stub
this.color = builder.color;
this.size = builder.size;
this.height = builder.height;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getSize() {
return size;
}
public void setSize(String size) {
this.size = size;
}
public String getHeight() {
return height;
}
public void setHeight(String height) {
this.height = height;
}
// 构建类
public static class Builder{
private String color;
private String size;
private String height;
public Builder() {
this.color = "白色";
this.height = "2";
}
public Builder addColor(String color) {
this.color = color;
return this;
}
public Builder addSize(String size) {
this.size = size;
return this;
}
public Builder addHeight(String height) {
this.height = height;
return this;
}
public House build() {
if (size == null) {
throw new NullPointerException("房屋大小不能为空");
}
return new House(this);
}
}
@Override
public String toString() {
return "House [color=" + color + ", size=" + size + ", height=" + height + "]";
}
}
建造者模式实质上就是一个复制的过程,在创建内部类Builder时,可以对部分参数设置默认值,这样就不用对每个参数进行赋值,然后采用链式赋值的方式进行参数的初始化,最后调用build()方法得到所需要的对象。
public class HouseTest {
public static void main(String args[]) {
House house = new House.Builder().addColor("红色").addSize("120").build();
System.out.println(house);
}
}
上面是构建者模式的调用。
优点:
1.将一个复杂对象的创建过程封装起来。
2.允许对象通过多个步骤创建,并且可以改变过程。
3。向客户隐藏产品内部表现。
4.产品的实现可以被替换,因为客户只看到一个抽象的接口。
缺点:
1.建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
2.如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
建造者模式与抽象工厂模式的比较:
与抽象工厂模式相比,建造者模式返回一个组装好的完整产品,而抽象工厂模式返回一系列相关的产品,这些产品位于不同的产品等级结构,构成了一个产品族 。
在抽象工厂模式中,客户端实例化工厂类,然后调用工厂方法获取所需产品对象,而在建造者模式中,客户端可以不直接调用建造者的相关方法,而是通过指挥者类来指导如何生成对象,包括对象的组装过程和建造步骤,它侧重于一步步构造一个复杂对象,返回一个完整的对象 。
网友评论