设计模式--建造者模式 builder

简介: 这篇文章通过一个电脑购买的例子,详细解释了建造者模式的四个角色(产品类、抽象构建者、实体构建类和指导者类),并提供了相应的代码实现,阐述了建造者模式在设计复杂对象时的应用和优势。

建造者模式简介

建造者模式有四个角色,概念划分如下:

  • Product : 产品类,最终要生成的对象(例如:一台电脑)。
  • Builder :构建者的抽象基类或则抽象接口。定义了Product产品的生产流程的抽象步骤(比如一台电脑可以在出厂的时候就将所有外设配件搭载齐全,也可以只是原装的一台电脑,外设需要自己从别的地方购买)。
  • ConcreteBuilder :Builder的实现类。
  • Direcotr : 决定如何构建最终产品的算法逻辑,多个方法Construct(Builder builder){//方法体}(例如:你是要买一台外设齐全的电脑,还是一台没有任何外设的原装电脑),最后通过Builder.getProduct()获得最终的产品。

类图如下(直接将韩老师的图拿过来了):
在这里插入图片描述

建造者模式–小例子(电脑购买)

购买一台电脑,可以买完整的包括所有外设的电脑,也可以买只有电脑本身无任何外设配件的电脑(且电脑品牌很多,联想华硕,可以自行选择电脑的cpu和主板,若买外设配件时,则根据购买电脑品牌来添加对应品牌外设)。
在这里插入图片描述

1.产品类

电脑CPU和主板都为必选,其余外设可不选。

package com.robin.builder;

// 一台完整的电脑产品
public class Computer {
   

    private String cpu; // cpu 必选
    private String mouse; // 鼠标 可选
    private String monitor; // 屏幕显示器 可选
    private String keyBoard; // 键盘 可选
    private String mainBoard; // 主板 必选


    // cpu和主板为必选,其余配件可以自行选择
    public Computer(String cpu, String mainBoard) {
   
        this.cpu = cpu;
        this.mainBoard = mainBoard;
    }

    // 对可选的配件提供setter方法
    public void setMouse(String mouse) {
   
        this.mouse = mouse;
    }

    public void setMonitor(String monitor) {
   
        this.monitor = monitor;
    }

    public void setKeyBoard(String keyBoard) {
   
        this.keyBoard = keyBoard;
    }

    @Override
    public String toString() {
   
        return "Computer{" +
                "cpu='" + cpu + '\'' +
                ", mouse='" + mouse + '\'' +
                ", monitor='" + monitor + '\'' +
                ", keyBoard='" + keyBoard + '\'' +
                ", mainBoard='" + mainBoard + '\'' +
                '}';
    }
}

2.抽象构建者

抽象构建者:

package com.robin.builder;

// 抽象构建者
public abstract class ComputerBuilder {
   

    public abstract Computer getComputer();

    public abstract void setMouse();

    public abstract void setMonitor();

    public abstract void setKeyBoard();

}

3.实体构建类

两个不同品牌的电脑实体构建类:

联想:

package com.robin.builder;

// 品牌电脑实体构建者类
public class LenovoComputerBuilder extends ComputerBuilder{
   

    private Computer computer;

    public LenovoComputerBuilder(String cpu, String mainBoard) {
   
        computer = new Computer(cpu, mainBoard);
    }

    @Override
    public Computer getComputer() {
   
        return computer;
    }

    @Override
    public void setMouse() {
   
        computer.setMouse("[lenovo]鼠标");
    }

    @Override
    public void setMonitor() {
   
        computer.setMonitor("[lenovo]240Hz高刷显示器");
    }

    @Override
    public void setKeyBoard() {
   
        computer.setKeyBoard("[lenovo]机械键盘");
    }
}

华硕:

package com.robin.builder;

public class ASUSComputerBuilder extends ComputerBuilder{
   

    private Computer computer;

    public ASUSComputerBuilder(String cpu,String mainBoard) {
   
        computer = new Computer(cpu, mainBoard);
    }

    @Override
    public Computer getComputer() {
   
        return computer;
    }

    @Override
    public void setMouse() {
   
        computer.setMouse("[华硕]鼠标");
    }

    @Override
    public void setMonitor() {
   
        computer.setMonitor("[华硕]显示屏");
    }

    @Override
    public void setKeyBoard() {
   
        computer.setKeyBoard("[华硕]机械键盘");
    }
}

4.指导者类

通过两个方法来确定,创建(购买)何种类型包含何种配件。

package com.robin.builder;

public class ComputerDirector {
   

    // 包含所有完整配件的电脑
    public void buyCompleteComputer(ComputerBuilder computerBuilder){
   
        computerBuilder.setMouse();
        computerBuilder.setKeyBoard();
        computerBuilder.setMonitor();
    }

    // 无配件的电脑
    public void buyNoAcesComputer(ComputerBuilder computerBuilder){
   }
}

5.客户端测试类

package com.robin.builder;

public class Main {
   
    public static void main(String[] args) {
   
        // 1.创建指挥者
        ComputerDirector computerDirector = new ComputerDirector();
        // 2.创建实体构造者
        LenovoComputerBuilder lenovoComputerBuilder = new LenovoComputerBuilder("i9", "QDI");
        // 3.指挥者调用构造者去设定电脑配件
        computerDirector.buyCompleteComputer(lenovoComputerBuilder);
        // 4.获取电脑产品
        Computer computer1 = lenovoComputerBuilder.getComputer();
        // 5.输出
        System.out.println(computer1);

        // 购买一台华硕电脑,其cpu为i7,主板为华硕,其余配件不进行选择
        ASUSComputerBuilder asusComputerBuilder = new ASUSComputerBuilder("i7", "华硕");
        computerDirector.buyNoAcesComputer(asusComputerBuilder);
        Computer computer2 = asusComputerBuilder.getComputer();
        System.out.println(computer2);
    }
}

在这里插入图片描述

小结

建造者模式是设计模式中创建型的一种,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式实用范围:

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同表示时

tip: 当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。


相关文章
|
10天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
6天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2506 14
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
6天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1519 14
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
8天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
531 13
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19282 30
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18836 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17524 13
Apache Paimon V0.9最新进展
|
8天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
458 48
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
|
1天前
|
云安全 存储 运维
叮咚!您有一份六大必做安全操作清单,请查收
云安全态势管理(CSPM)开启免费试用
355 4
叮咚!您有一份六大必做安全操作清单,请查收
|
2天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。