建造者模式

建造者模式

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

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

实际案例: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)]

相关推荐

  1. 建造模式(Builder)

    2024-07-09 17:00:08       56 阅读
  2. 建造模式

    2024-07-09 17:00:08       35 阅读
  3. 建造模式

    2024-07-09 17:00:08       45 阅读
  4. 建造模式(Builder)

    2024-07-09 17:00:08       42 阅读
  5. 建造模式

    2024-07-09 17:00:08       42 阅读
  6. 建造模式

    2024-07-09 17:00:08       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 17:00:08       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 17:00:08       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 17:00:08       58 阅读
  4. Python语言-面向对象

    2024-07-09 17:00:08       69 阅读

热门阅读

  1. 单例模式之懒汉式

    2024-07-09 17:00:08       30 阅读
  2. 代码技巧专题 -- 使用策略模式编写HandleService

    2024-07-09 17:00:08       29 阅读
  3. 汇编学习基础知识【记录】

    2024-07-09 17:00:08       26 阅读
  4. mapper.xml 文件对应的 Dao 接口原理

    2024-07-09 17:00:08       25 阅读
  5. Linux服务监控自动巡检脚本--推送钉钉告警

    2024-07-09 17:00:08       34 阅读
  6. stm32中断

    2024-07-09 17:00:08       26 阅读
  7. 使用引用 XML 文件来优化 EtherCAT ESI 文件的描述

    2024-07-09 17:00:08       33 阅读
  8. uni app for()在App上不运行

    2024-07-09 17:00:08       25 阅读
  9. OpenSNN推文:盛夏智慧之光:七月高校新闻聚焦

    2024-07-09 17:00:08       33 阅读
  10. 【计算机网络——1.2网络边缘】

    2024-07-09 17:00:08       34 阅读
  11. 音频demo:将PCM数据与g726数据的相互转换

    2024-07-09 17:00:08       26 阅读
  12. x-mind没有配置文件,可以自己创建文件修改内存

    2024-07-09 17:00:08       53 阅读
  13. Flink 窗口触发器(Trigger)(二)

    2024-07-09 17:00:08       25 阅读