一、简单介绍
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 。
经典的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
;
}
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);
}
}
}