文章目录
建造者模式
建造者模式属于创造型的模式,用于创建复杂对象,将创建复杂对象的逻辑与对象本身表示分离出来,比如宝马这个产品,需要构建方向盘,轮胎,后备箱等等复杂逻辑操作,就可以使用建造者模式。
建造者主要是想把复杂对象的建造过程以及对象本身表达分离出来。将变化的代码从不变的代码中分离出来,起到代码的复用性。
实际案例:StringBuild 的源码
建造者模式的角色
- 具体产品:一个具体产品的表示
- 抽象建造:定义产品建造过程中相关的方法,
- 具体建造:实现抽象建造,定义产品具体的建造。
- 指挥者:用于建造对象,提供对象的返回,关注于产品建造的顺序,不关注产品的具体建造。
案例

代码
定义产品
            
            
              java
              
              
            
          
          /**
 *  产品
 *
 * @author: Hui
 **/
@Data
public class House {
    private String bisic;
    private String wall;
    private String roof;
}定义抽象建造者以及具体建造者
            
            
              java
              
              
            
          
          /**
 *  抽象建造者
 *
 * @author: Hui
 **/
public abstract class HouseBuild {
    private House house = new House();
    public abstract void buildBasic();
    public abstract void buildWalls();
    public abstract void roofed();
    public House buildHouse(){
        return house;
    }
}
/**
 * 具体建造者:普通房子
 *
 * @author: Hui
 **/
public class CommonHouse extends HouseBuild {
    @Override
    public void buildBasic() {
        System.out.println(" 普通房子打地基 5 米 ");
    }
    @Override
    public void buildWalls() {
        System.out.println(" 普通房子砌墙 10cm ");
    }
    @Override
    public void roofed() {
        System.out.println(" 普通房子封顶 ");
    }
}
package build;
/**
 *  具体建造者:高楼
 *
 * @author: Hui
 **/
public class HighHouse extends HouseBuild{
    @Override
    public void buildBasic() {
        System.out.println(" 高楼打地基 100 米 ");
    }
    @Override
    public void buildWalls() {
        System.out.println(" 高楼砌墙 ");
    }
    @Override
    public void roofed() {
        System.out.println(" 高楼封顶-透明顶 ");
    }
}定义指挥者
            
            
              java
              
              
            
          
          /**
 *  指挥者:用于返回创建对象,设置对象创建的顺序
 *
 * @author: Hui
 **/
public class HouseDirector {
    //聚合抽象建造者
    private HouseBuild houseBuild;
    //使用构造方法来设置抽象建造者
    public HouseDirector(HouseBuild houseBuild){
        this.houseBuild = houseBuild;
    }
    //使用 set 方法来设置抽象建造者
    public void setHouseBuild(HouseBuild houseBuild){
        this.houseBuild = houseBuild;
    }
    //提供返回产品对象的方法。
    public House buildHouse(){
        houseBuild.buildBasic();
        houseBuild.buildWalls();
        houseBuild.roofed();
        return houseBuild.buildHouse();
    }客户端使用
            
            
              java
              
              
            
          
          /**
 *  客户端
 *
 * @author: Hui
 **/
public class Client {
    public static void main(String[] args) {
        //建造普通房子
        System.out.println("建造普通房子");
        HouseDirector houseDirector = new HouseDirector(new CommonHouse());
        House house = houseDirector.buildHouse();
//        System.out.println(house);
        System.out.println("------------------------------");
        //建造高楼
        System.out.println("建造高楼");
        houseDirector.setHouseBuild(new HighHouse());
        House house1 = houseDirector.buildHouse();
//        System.out.println(house1);
    }
}输出结果

d(new HighHouse());
House house1 = houseDirector.buildHouse();
// System.out.println(house1);
}
}
### 输出结果
[外链图片转存中...(img-fqB3aKVI-1720330094469)]