建造者模式

建造者模式属于创造型的模式,用于创建复杂对象,将创建复杂对象的逻辑与对象本身表示分离出来,比如宝马这个产品,需要构建方向盘,轮胎,后备箱等等复杂逻辑操作,就可以使用建造者模式。

建造者主要是想把复杂对象的建造过程以及对象本身表达分离出来。将变化的代码从不变的代码中分离出来,起到代码的复用性。

实际案例:StringBuild 的源码

建造者模式的角色

  • 具体产品:一个具体产品的表示
  • 抽象建造:定义产品建造过程中相关的方法,
  • 具体建造:实现抽象建造,定义产品具体的建造。
  • 指挥者:用于建造对象,提供对象的返回,关注于产品建造的顺序,不关注产品的具体建造。

案例

image-20240707131043783

代码

定义产品

/**
 *  产品
 *
 * @author: Hui
 **/
@Data
public class House {

    private String bisic;
    private String wall;
    private String roof;

}

定义抽象建造者以及具体建造者

/**
 *  抽象建造者
 *
 * @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(" 高楼封顶-透明顶 ");
    }
}


定义指挥者

/**
 *  指挥者:用于返回创建对象,设置对象创建的顺序
 *
 * @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();
    }


客户端使用

/**
 *  客户端
 *
 * @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);
    }

}

输出结果

image-20240707132707564

d(new HighHouse());
House house1 = houseDirector.buildHouse();
// System.out.println(house1);
}

}


### 输出结果

[外链图片转存中...(img-fqB3aKVI-1720330094469)]

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部