建造者模式
1. 什么是建造者模式
Builder 模式也叫建造者模式或者生成器模式,是由 GoF 提出的 23 种设计模式中的一种。
Builder 模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。
2. 建造者模式的结构
3. 建造者模式应用场景
- 对象的创建:Builder 模式是为对象的。
- 创建而设计的模式创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象。
- 关注对象创建的各部分的创建过程:不同的工厂(这里指 builder 生成器)对产品属性有不同的创建方法。
4. 代码演示
4.1. 直接创建
public class House {
private String floor;
private String wall;
private String ceiling;
public String getFloor() {
return floor;
}
public void setFloor(String floor) {
this.floor = floor;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getCeiling() {
return ceiling;
}
public void setCeiling(String ceiling) {
this.ceiling = ceiling;
}
@Override
public String toString() {
return "House{" +
"floor='" + floor + '\'' +
", wall='" + wall + '\'' +
", ceiling='" + ceiling + '\'' +
'}';
}
}
House house = new House();
house.setFloor("地板");
house.setWall("墙");
house.setCeiling("屋顶");
System.out.println(house);
4.2. 使用建造者
public interface HouseBuilder {
void makeFloor();
void makeWall();
void makeCeiling();
House getHouse();
}
public class PingFangBuilder implements HouseBuilder {
House house = new House();
@Override
public void makeFloor() {
house.setFloor("平房-->地板");
}
@Override
public void makeWall() {
house.setWall("平房-->墙");
}
@Override
public void makeCeiling() {
house.setCeiling("平房-->屋顶");
}
@Override
public House getHouse() {
return house;
}
}
HouseBuilder builder = new PingFangBuilder();
builder.makeFloor();
builder.makeWall();
builder.makeCeiling();
House house = builder.getHouse();
System.out.println(house);
4.3. 引入包工头
public class HouseDirector {
private final HouseBuilder builder;
public HouseDirector(HouseBuilder builder) {
this.builder = builder;
}
public void makeHouse() {
builder.makeFloor();
builder.makeWall();
builder.makeCeiling();
}
}
HouseBuilder builder = new PingFangBuilder();
HouseDirector director = new HouseDirector(builder);
director.makeHouse();
House house = builder.getHouse();
System.out.println(house);
4.4. 新增建造者
public class GongYuBuilder implements HouseBuilder {
House house = new House();
@Override
public void makeFloor() {
house.setFloor("公寓-->地板");
}
@Override
public void makeWall() {
house.setWall("公寓-->墙");
}
@Override
public void makeCeiling() {
house.setCeiling("公寓-->屋顶");
}
@Override
public House getHouse() {
return house;
}
}
HouseBuilder builder1 = new PingFangBuilder();
HouseDirector1 director1 = new HouseDirector1(builder1);
director1.makeHouse();
House house = builder1.getHouse();
System.out.println(house);
HouseBuilder builder2 = new GongYuBuilder();
HouseDirector1 director2 = new HouseDirector1(builder2);
director2.makeHouse();
House house2 = builder2.getHouse();
System.out.println(house2);
4.5. 另一种包工头
public class HouseDirector3 {
public void makeHouse(HouseBuilder builder) {
builder.makeFloor();
builder.makeWall();
builder.makeCeiling();
}
}
HouseBuilder builder1 = new PingFangBuilder();
HouseDirector2 director1 = new HouseDirector2();
director1.makeHouse(builder1);
House house = builder1.getHouse();
System.out.println(house);
HouseBuilder builder2 = new GongYuBuilder();
HouseDirector2 director2 = new HouseDirector2();
director2.makeHouse(builder2);
House house2 = builder2.getHouse();
System.out.println(house2);