码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 软件设计模式系列之五——建造者模式


    合集 - 设计模式(25)
    1.软件设计模式系列之一——设计模式概述09-052.软件设计模式系列之二———抽象工厂模式09-083.软件设计模式系列之三———工厂方法模式09-124.软件设计模式系列之四——简单工厂模式09-13
    5.软件设计模式系列之五——建造者模式09-14
    6.软件设计模式系列之六——单例模式09-157.软件设计模式系列之七——原型模式09-178.软件设计模式系列之八——适配器模式09-189.软件设计模式系列之九——桥接模式09-1910.软件设计模式系列之十——组合模式09-2011.软件设计模式系列之十一——装饰模式09-2112.软件设计模式系列之十二——外观模式09-2213.软件设计模式系列之十三——享元模式09-2314.软件设计模式系列之十四——代理模式09-2415.软件设计模式系列之十五——职责链模式09-2516.软件设计模式系列之十六——命令模式09-2717.软件设计模式系列之十七——解释器模式09-2818.软件设计模式系列之十八——迭代器模式09-2819.软件设计模式系列之十九——中介者模式09-2920.软件设计模式系列之二十——备忘录模式09-3021.软件设计模式系列之二十一——观察者模式10-0122.软件设计模式系列之二十二——状态模式10-0423.软件设计模式系列之二十三——策略模式10-0424.软件设计模式系列之二十四——模板方法模式10-0525.软件设计模式系列之二十五——访问者模式10-05
    收起

    1 模式的定义

    建造者模式是一种对象创建型设计模式,它将一个复杂对象的构建过程与其表示分离。这意味着你可以使用相同的构建过程来创建不同类型的对象,而不必关心每个对象的内部细节。这种模式适用于构建具有复杂配置的对象,例如具有多个可选组件的汽车。

    2 结构

    建造者模式的结构包括以下几个关键部分:

    Director(指导者):负责指导构建过程的顺序,它并不直接创建产品,而是通过建造者来构建产品。
    Builder(建造者):定义了创建产品各个部分的接口,具体的建造者实现这些接口以构建具体产品。
    ConcreteBuilder(具体建造者):实现了Builder接口,负责具体产品的构建过程。
    Product(产品):表示最终构建出的复杂对象,它通常包含了多个部分。

    3 举例说明

    建造者模式可以通过组装电脑的过程来解释。在电脑组装中,你有多个可选组件(如CPU、内存、硬盘、显卡等),每个组件有不同的配置选项。建造者模式将这个过程分解为以下部分:

    产品(Product):电脑是最终的产品,具有多个组件(CPU、内存等)。

    抽象建造者(Builder):定义了创建电脑各个组件的接口,例如安装CPU、内存等。

    具体建造者(Concrete Builder):每个具体建造者实现了抽象建造者接口,负责构建不同配置的电脑,例如高性能电脑、办公电脑等。

    指导者(Director):负责指导建造电脑的顺序,如安装CPU、内存、硬盘等。

    通过建造者模式,你可以使用相同的构建过程创建不同类型的电脑,保持了灵活性和可维护性,同时将构建过程与最终产品分离,使得电脑组装变得更加可控和可扩展。

    4 实现步骤

    建造者模式的实现步骤通常包括:

    定义产品的抽象类或接口,以及产品的各个部分。
    创建具体建造者类,实现Builder接口,负责构建产品的各个部分。
    创建Director类,负责指导建造过程的顺序,它包含一个Builder成员变量用于构建产品。
    在客户端代码中,创建Director对象并指定一个具体的建造者对象,然后通过Director来构建产品。

    5 代码实现

    以下是一个简单的Java代码示例,演示了如何使用建造者模式来组装电脑,包括CPU、硬盘和主板等组件.

    // 产品类:电脑
    class Computer {
        private String cpu;
        private String hardDisk;
        private String motherboard;
    
        public void setCPU(String cpu) {
            this.cpu = cpu;
        }
    
        public void setHardDisk(String hardDisk) {
            this.hardDisk = hardDisk;
        }
    
        public void setMotherboard(String motherboard) {
            this.motherboard = motherboard;
        }
    
        @Override
        public String toString() {
            return "Computer [CPU=" + cpu + ", HardDisk=" + hardDisk + ", Motherboard=" + motherboard + "]";
        }
    }
    
    // 抽象建造者接口
    interface ComputerBuilder {
        void buildCPU();
    
        void buildHardDisk();
    
        void buildMotherboard();
    
        Computer getComputer();
    }
    
    // 具体建造者类
    class HighEndComputerBuilder implements ComputerBuilder {
        private Computer computer;
    
        public HighEndComputerBuilder() {
            computer = new Computer();
        }
    
        @Override
        public void buildCPU() {
            computer.setCPU("High-end CPU");
        }
    
        @Override
        public void buildHardDisk() {
            computer.setHardDisk("1TB SSD");
        }
    
        @Override
        public void buildMotherboard() {
            computer.setMotherboard("High-end Motherboard");
        }
    
        @Override
        public Computer getComputer() {
            return computer;
        }
    }
    
    // 指导者类
    class Director {
        private ComputerBuilder computerBuilder;
    
        public Director(ComputerBuilder builder) {
            this.computerBuilder = builder;
        }
    
        public void constructComputer() {
            computerBuilder.buildCPU();
            computerBuilder.buildHardDisk();
            computerBuilder.buildMotherboard();
        }
    }
    
    // 客户端代码
    public class Main {
        public static void main(String[] args) {
            ComputerBuilder builder = new HighEndComputerBuilder();
            Director director = new Director(builder);
    
            director.constructComputer();
            Computer highEndComputer = builder.getComputer();
    
            System.out.println("High-end Computer Specs:");
            System.out.println(highEndComputer);
        }
    }
    

    在这个示例中,我们定义了产品类Computer,抽象建造者接口ComputerBuilder,以及具体建造者类HighEndComputerBuilder。指导者类Director负责控制构建过程的顺序。客户端代码创建具体建造者对象并使用指导者来构建电脑。这样,我们就可以轻松地创建不同配置的电脑对象。

    6 典型应用场景

    建造者模式在创建复杂对象时,它可以提供一种更加灵活和可维护的方式。以下是建造者模式的一些典型应用场景:

    创建复杂对象:建造者模式适用于构建复杂的对象,这些对象可能有多个组件或部分,而且这些组件之间存在复杂的依赖关系。例如,创建包含多个可选组件的电子产品、汽车、飞机等。

    隐藏构造过程的细节:建造者模式允许将构造对象的复杂性封装在具体建造者中,客户端代码只需关心如何指导建造过程,而不必关心对象的具体构建细节。这有助于降低客户端代码的复杂性。

    创建不同配置的对象:如果需要创建多个具有相似属性但不同配置的对象,建造者模式非常有用。你可以使用不同的具体建造者来创建不同配置的对象,而不必重复相似的构建代码。

    提高代码可读性:通过使用建造者模式,可以清晰地看到对象的构建过程,使代码更易于理解和维护。每个具体建造者都负责一部分构建过程,使代码更加模块化和可读性更高。

    避免对象不完整或不一致:建造者模式可以确保在构建对象的过程中不会产生不完整或不一致的对象。在构建过程中,要么对象完全构建成功,要么不构建。

    总之,建造者模式在需要创建复杂对象、隐藏构建细节、提高可读性和灵活性等情况下非常有用。它允许你以分步骤的方式构建对象,并在创建过程中动态配置对象的属性,使得代码更易于管理和维护。

    7 优缺点

    优点:

    将构建过程与产品表示分离,使得构建过程更灵活。
    可以通过不同的具体建造者来创建不同类型的对象。
    可以重复使用相同的构建过程来构建不同的对象。

    缺点:

    增加了代码的复杂性,因为需要定义抽象建造者和具体建造者类。
    如果产品的部分组件较少,可能会显得过于繁琐。

    8 类似模式

    建造者模式与以下几种设计模式有一定的相似性:

    抽象工厂模式(Abstract Factory Pattern):抽象工厂模式也用于创建复杂对象,但它关注的是创建一组相关或相互依赖的对象,而不是单个对象。建造者模式关注的是构建单个复杂对象,其构建过程逐步进行。

    工厂模式(Factory Pattern):工厂模式用于创建对象,但不像建造者模式那样关心对象的构建过程的细节。工厂模式简单地返回一个已经构建好的对象,而建造者模式允许在构建过程中设置对象的属性和配置。

    原型模式(Prototype Pattern):原型模式通过复制现有对象来创建新对象,而不需要详细的构建过程。与建造者模式不同,原型模式不涉及构建对象的复杂性,而是复制现有对象的状态。

    9 小结

    建造者模式是一种有助于创建复杂对象的设计模式,它通过将构建过程分步骤进行,允许你创建不同类型的对象,并保持构建过程的独立性。通过定义抽象建造者和具体建造者类,以及使用指导者来管理构建顺序,你可以更好地控制对象的构建过程。建造者模式在需要创建多个不同配置的对象或构建过程较为复杂的情况下特别有用。但要注意,它可能会增加代码的复杂性,因此应在合适的情况下使用。

  • 相关阅读:
    NC14745 Hungry!
    在openwrt dnsmasq DHCP中为客户端分配不同的网关和DNS | 旁路由 禁止上网
    从实现一个React到深度理解React框架核心原理
    阿里云docker容器服务器安装nextcloud步骤
    计算机网络-局域网和城域网(二)
    2022年全国最新消防设施操作员(中级消防设施操作员)题库及答案
    SpringCloud的新闻资讯项目08 --- 平台管理-需求说明和接口文档
    MySql8.0 + Qt 对数据库操作 - 初窥篇1
    GROMACS Tutorial 5: Protein-Ligand Complex 中文实战教程
    C++设计模式_09_Abstract Factory 抽象工厂
  • 原文地址:https://www.cnblogs.com/coodream2009/p/17703171.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号