建造者模式
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;}@Overridepublic 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();@Overridepublic void makeFloor() {house.setFloor("平房-->地板");}@Overridepublic void makeWall() {house.setWall("平房-->墙");}@Overridepublic void makeCeiling() {house.setCeiling("平房-->屋顶");}@Overridepublic 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();@Overridepublic void makeFloor() {house.setFloor("公寓-->地板");}@Overridepublic void makeWall() {house.setWall("公寓-->墙");}@Overridepublic void makeCeiling() {house.setCeiling("公寓-->屋顶");}@Overridepublic 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);
