一、简单介绍
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 。
经典的UML类图(来自百度):
其中,Director被称为导向器,它用于指导具体构建者如何构建产品,控制调用先后次序,并向调用者返回完整的产品类。
注意:
抽象工厂(Abstract Factory)模式与建造者(Builder)模式相似,因为它也能创建复杂对象。
主要的区别是:
- Builder模式着重于一步步构建一个复杂对象。
- Abstract Factory着重于多个系列的产品对象(简单的或是复杂的)。
- Builder在最后一步返回产品。
- 对于Abstract Factory来说,产品是立即返回的。
二、实现方法
1、传统(经典)的实现方法
public class BuildExample {
public static void main(String[] args) {
Director director = new Director(new RedmiBuilder());
Phone phone = director.construct();
System.out.println(phone);
}
}
//--------------------------产品-------------------------
class Phone {
private String cpu;
private String ram;
private String rom;
// 省略getter、setter和toString
}
//--------------------------构建者接口-------------------------
interface Builder {
void setCpu();
void setRam();
void setRom();
Phone getPhone();
}
//--------------------------具体的构建者-------------------------
class RedmiBuilder implements Builder {
private final Phone redmiPhone = new Phone();
@Override
public void setCpu() {
redmiPhone.setCpu("8086");
}
@Override
public void setRam() {
redmiPhone.setRam("2G");
}
@Override
public void setRom() {
redmiPhone.setRom("128G");
}
@Override
public Phone getPhone() {
return redmiPhone;
}
}
//--------------------------引导者-------------------------
class Director {
private Builder builder = null;
Director(Builder builder) {
this.builder = builder;
}
public Phone construct() {
builder.setCpu();
builder.setRam();
builder.setRom();
return builder.getPhone();
}
}
2、Java中的实现方式
public class BuildExample {
public static void main(String[] args) {
Phone phone = new Phone.Builder()
.setCpu("8086")
.setRam("2G")
.setRom("128G")
.build();
System.out.println(phone);
}
}
//--------------------------产品-------------------------
class Phone {
private final String cpu;
private final String ram;
private final String rom;
private Phone(Builder builder){
this.cpu=builder.cpu;
this.ram=builder.ram;
this.rom=builder.rom;
}
public static final class Builder {
private String cpu;
private String ram;
private String rom;
public Builder setCpu(String cpu) {
this.cpu = cpu;
return this;
}
public Builder setRam(String ram) {
this.ram = ram;
return this;
}
public Builder setRom(String rom) {
this.rom = rom;
return this;
}
public Phone build() {
return new Phone(this);
}
}
// 省略toString
}