Skip to content

Latest commit

 

History

History
191 lines (167 loc) · 4.52 KB

README.md

File metadata and controls

191 lines (167 loc) · 4.52 KB

建造者模式

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);