用于一个类拥有很多属性的场景;
构建者模式强调组成一个对象的组成过程;如果属性很多,用构造器需要传递很多参数;
1.产品类
package No4_构建者模式;
/**
* 产品对象
*/
public class Bike {
private String frame;
private String seat;
public String getFrame() {
return frame;
}
public void setFrame(String frame) {
this.frame = frame;
}
public String getSeat() {
return seat;
}
public void setSeat(String seat) {
this.seat = seat;
}
}
2.Builder类
- 1.声明产品类
- 2.声明 用于构建车的组件的 几个抽象方法
- 3.声明 用于构建车 抽象方法
package No4_构建者模式;
public abstract class Builder {
//todo 1.声明产品类
protected Bike bike = new Bike();
//todo 2.声明 用于构建车的组件的 几个抽象方法
public abstract void buildFrame();
public abstract void buildSeat();
//todo 3.声明 用于构建车 抽象方法
public abstract Bike createBike();
}
3.指挥类
- 指挥类用于调用Builder类,来组装一个对象
package No4_构建者模式;
public class Director {
//todo 1.声明一个Builder
private Builder mBuilder;
//todo 2.传入一个Builder实现类
public Director(Builder builder) {
mBuilder = builder;
}
//todo 3. 组装过程
public Bike construct() {
mBuilder.buildFrame();
mBuilder.buildSeat();
return mBuilder.createBike();
}
}
4.构建过程
4.1 一个具体的产品Builder类
package No4_构建者模式;
/**
* 具体的构建者
* 用于构建摩拜单车
*/
public class MobikeBuilder extends Builder {
@Override
public void buildFrame() {
bike.setFrame("铝合金车架");
}
@Override
public void buildSeat() {
bike.setSeat("真皮车座");
}
@Override
public Bike createBike() {
return bike;
}
}
4.2 客户端使用
package No4_构建者模式;
public class Client {
public static void main(String[] args) {
Director director = new Director(new MobikeBuilder());
Bike bike = director.construct();
System.out.println(bike.getSeat());
}
}
模式扩展
1.普通的创建对象
package No4_构建者模式.模式扩展;
public class Phone {
private String cpu;
private String screen;
private String memory;
private String mainboard;
public Phone(String cpu, String screen, String memory, String mainboard) {
this.cpu = cpu;
this.screen = screen;
this.memory = memory;
this.mainboard = mainboard;
}
public String getCpu() {
return cpu;
}
public void setCpu(String cpu) {
this.cpu = cpu;
}
public String getScreen() {
return screen;
}
public void setScreen(String screen) {
this.screen = screen;
}
public String getMemory() {
return memory;
}
public void setMemory(String memory) {
this.memory = memory;
}
public String getMainboard() {
return mainboard;
}
public void setMainboard(String mainboard) {
this.mainboard = mainboard;
}
@Override
public String toString() {
return "Phone{" +
"cpu='" + cpu + '\'' +
", screen='" + screen + '\'' +
", memory='" + memory + '\'' +
", mainboard='" + mainboard + '\'' +
'}';
}
}
class Client1 {
public static void main(String[] args) {
//构建Phone对象
Phone phone = new Phone("intel","三星屏幕","金士顿","华硕");
System.out.println(phone);
}
}
2.模式扩展
- 将Builder类用作内部类
package No4_构建者模式.模式扩展;
public class Phone2{
private String cpu;
private String screen;
private String memory;
private String mainboard;
private Phone2(Builder builder) {
cpu = builder.cpu;
screen = builder.screen;
memory = builder.memory;
mainboard = builder.mainboard;
}
public static final class Builder {
private String cpu;
private String screen;
private String memory;
private String mainboard;
public Builder() {}
public Builder cpu(String val) {
cpu = val;
return this;
}
public Builder screen(String val) {
screen = val;
return this;
}
public Builder memory(String val) {
memory = val;
return this;
}
public Builder mainboard(String val) {
mainboard = val;
return this;
}
public Phone2 build() {
return new Phone2(this);}
}
@Override
public String toString() {
return "Phone{" +
"cpu='" + cpu + '\'' +
", screen='" + screen + '\'' +
", memory='" + memory + '\'' +
", mainboard='" + mainboard + '\'' +
'}';
}
}
class Client2 {
public static void main(String[] args) {
Phone2 phone = new Phone2.Builder()
.cpu("intel")
.mainboard("华硕")
.memory("金士顿")
.screen("三星")
.build();
System.out.println(phone);
}
}