创建者模式(Builder Pattern):构造复杂对象的通用解决方案

news2024/12/23 18:22:49

文章目录

  • **一、技术背景与应用场景**
    • **为何使用创建者模式?**
    • **典型应用场景包括但不限于:**
  • **二、创建者模式定义与结构**
  • **三、使用步骤举例**
  • 四、优缺点分析
  • 总结

一、技术背景与应用场景

创建者模式是一种对象创建型设计模式,它通过将复杂的构建过程与表示分离,使得相同的创建过程可以创建不同的表示。这种模式在面对具有多个可选组成部分和多种组合方式的对象时尤为有用,如配置文件生成、复杂查询语句构造、产品装配等。

为何使用创建者模式?

  1. 隐藏复杂性:当一个类有多个构造参数或初始化步骤比较复杂时,使用创建者模式可以避免暴露过多的构造器参数。
  2. 重用代码:不同类型的复杂对象可以通过共享相同的创建逻辑来实现代码重用。
  3. 灵活性:可以灵活地改变产品内部结构,而无需修改客户端代码。

典型应用场景包括但不限于:

  • 复杂的对象构建:如创建具有多种配置选项的产品实例。
  • XML 或 JSON 解析:根据输入数据动态构建对象树。
  • SQL 查询构造:根据用户需求拼接出复杂的 SQL 语句。

二、创建者模式定义与结构

创建者模式包含以下核心组成部分:

在这里插入图片描述

  1. Product(产品接口):声明产品的接口,这里通常是一个抽象类或者接口,定义了产品的共有属性和方法。
  2. ConcreteProduct(具体产品):实现了 Product 接口的具体产品类。
  3. Builder(抽象建造者):声明了一系列用于构建最终产品的操作,并声明了一个返回最终产品的方法 getResult
  4. ConcreteBuilder(具体建造者):继承自 Builder,实现了所有声明的构建方法,负责按顺序创建并组装产品的各个部分。
  5. Director(导演类):独立于具体建造者的角色,负责调用建造者的方法来控制产品的创建过程。

三、使用步骤举例

假设我们要构建一个简单的电脑配置类(Computer),它包含CPU、内存、硬盘等多个组成部分,而这些组成部分有不同的选择。为了更好地封装构建过程,我们将使用创建者模式来设计代码。

  1. Computer 是抽象产品,定义了所有电脑配置共有的属性和行为。

    // 抽象产品 - 电脑配置
    public abstract class Computer {
        protected String cpu;
        protected String ram;
        protected String hardDisk;
    
        public String getCpu() {
            return cpu;
        }
    
        public String getRam() {
            return ram;
        }
    
        public String getHardDisk() {
            return hardDisk;
        }
    
        // 抽象方法用于展示配置详情
        public abstract void display();
    }
    
  2. GamingComputer 是具体产品,继承自抽象产品并实现了具体的配置细节。

    // 具体产品 - 高端游戏电脑配置
    public class GamingComputer extends Computer {
        public GamingComputer(String cpu, String ram, String hardDisk) {
            super();
            this.cpu = cpu;
            this.ram = ram;
            this.hardDisk = hardDisk;
        }
    
        @Override
        public void display() {
            System.out.println("Gaming Computer Configuration:");
            System.out.println("CPU: " + cpu);
            System.out.println("RAM: " + ram);
            System.out.println("Hard Disk: " + hardDisk);
        }
    }
    
  3. ComputerBuilder 是抽象建造者,声明了用来构建电脑配置的各项基本操作。

    // 抽象建造者 - 电脑配置建造者
    public abstract class ComputerBuilder {
        protected Computer computer;
    
        public abstract void buildCpu();
        public abstract void buildRam();
        public abstract void buildHardDisk();
    
        // 返回最终的产品
        public Computer getComputer() {
            return computer;
        }
    }
    
  4. GamingComputerBuilder 是具体建造者,通过覆盖抽象建造者中的方法,为高端游戏电脑配置具体的硬件组件。

    // 具体建造者 - 高端游戏电脑配置建造者
    public class GamingComputerBuilder extends ComputerBuilder {
        public GamingComputerBuilder() {
            computer = new GamingComputer("", "", "");
        }
    
        @Override
        public void buildCpu() {
            computer.cpu = "Intel Core i9-12900K";
        }
    
        @Override
        public void buildRam() {
            computer.ram = "32GB DDR5 RAM";
        }
    
        @Override
        public void buildHardDisk() {
            computer.hardDisk = "1TB NVMe SSD";
        }
    }
    
  5. 在客户端代码中,通过调用具体建造者的构建方法,一步步构建出所需的具体产品,并最终展示其配置信息。

    // 客户端代码
    public class Client {
        public static void main(String[] args) {
            // 创建具体建造者对象
            ComputerBuilder builder = new GamingComputerBuilder();
    
            // 按照流程构建电脑配置
            builder.buildCpu();
            builder.buildRam();
            builder.buildHardDisk();
    
            // 获取构建完成的电脑配置对象
            Computer gamingComputer = builder.getComputer();
    
            // 显示电脑配置信息
            gamingComputer.display();
        }
    }
    

测试结果

在这里插入图片描述

四、优缺点分析

创建者模式的优点在于:

  1. 封装性与解耦:创建者模式将复杂对象的构造过程与表示分离,客户端无需了解具体的构建细节,只需指定需要的产品类型或配置参数。这增强了系统的封装性和模块间的解耦。

  2. 产品一致性:创建者模式确保了无论何时通过建造者创建的产品,其内部结构都是一致的。即使在复杂的构建过程中,也能保持产品的完整性。

  3. 扩展性良好:当产品类增加新的属性或行为时,只需要修改相应的建造者类即可,不影响已有的代码和使用该模式的客户端代码。

  4. 便于并行构造:由于创建过程被分步实现,因此在某些情况下,可以并行执行各部分的构建工作,提高系统性能。

潜在挑战可能包括:

  1. 类数量增多:引入创建者模式后,会增加抽象建造者、具体建造者以及可选的指挥者等多个类,导致类的数量增多,一定程度上增加了系统的复杂性。

  2. 过度设计:如果产品的构建过程并不复杂或者变化较少,强制使用创建者模式可能会造成设计上的过度复杂化。

  3. 理解和调试难度:对于包含多个具体建造者的大型系统,理解各个建造者之间的关系和作用可能较为困难,特别是当建造过程涉及多层嵌套调用时,调试起来也可能较为复杂。

总结

​ 创建者模式通过将构建过程与表示分离,使得客户端只需关注构建过程本身而不必关心具体产品的内部构造细节。这不仅提高了系统的灵活性和可扩展性,也使代码更加清晰易读,降低了模块间的耦合度。然而,过度使用创建者模式可能导致类数量增多,应合理评估是否真正需要创建者模式来处理对象的创建过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1468795.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营29期|day60 任务以及具体安排

第九章 动态规划part17 647. 回文子串 class Solution {public int countSubstrings(String s) {char[] chars s.toCharArray();int len chars.length;boolean[][] dp new boolean[len][len];int result 0;for (int i len - 1; i > 0; i--) {for (int j i; j < le…

高级语言期末2011级A卷

1.编写函数&#xff0c;判定正整数m和n&#xff08;均至少为2&#xff09;是否满足&#xff1a;数m为数n可分解的最小质因数&#xff08;数n可分解的最小质因数为整除n的最小质数&#xff09; 提示&#xff1a;判定m为质数且m是n的最小因数 #include <stdio.h> #include…

算法打卡day1|数组篇|Leetcode 704.二分查找、27.移除元素

数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合&#xff0c;可以方便的通过下标索引的方式获取到下标下对应的数据。 1.数组下标都是从0开始的。 2.数组内存空间的地址是连续的。 正是因为数组的在内存空间的地址是连续的&#xff0c;所以我们在删除或者增添…

Visual Studio 打开.edmx文件不显示表并报错:没有可用于.edmx的编辑器

打开.edmx文件时&#xff0c;呈现的是xml视图&#xff0c;不显示Diagram视图&#xff0c;且弹出报错“没有可用于.edmx的编辑器” 解决方案&#xff1a;在.edmx文件上右键&#xff0c;选择ado.net entity data model designer&#xff0c;即可正常显示表

mysql-MVCC

一、基础概念 1. MVCC的含义 MVCC (Multiversion Concurrency Control)&#xff0c;即多版本并发控制技术&#xff0c;它是通过读取某个时间点的快照数据&#xff0c; 来降低并发事务冲突而引起的锁等待&#xff0c; 从而提高并发性能的一种机制. MVCC 的实现,是通过保存数据…

N种方法解决1(CTF)

这里遇到的问题&#xff1a;一开始采用的base64解码平台有问题&#xff1b;默认解密出的格式为GBK格式&#xff1b;直接复制粘贴发现无法还原图片&#xff1b;又尝试了其他编码的&#xff1b;发现只有hex格式可以保证图片正常还原&#xff1b; 图片是以二进制存储的&#xff1…

响应式页面兼容移动端

文章目录 1. 响应式开发1.1 原理1.2 响应式容器 2. Bootstrap前端开发框架2.1 Bootstrap介绍(1) 优点(2) 版本 2.2 Bootstrap使用2.3 布局容器(1) container类(2) container-fluid类 3.Bootstrap栅格系统3.1 介绍3.2 栅格选项参数3.3 列嵌套3.4 列偏移3.5 列排序3.6 响应式工具…

Android14之input高级调试技巧(一百八十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【Python笔记-设计模式】享元模式

一、说明 享元模式是一种结构型设计模式&#xff0c;它摒弃了在每个对象中保存所有数据的方式&#xff0c;通过共享多个对象所共有的相同状态&#xff0c;让你能在有限的内存容量中载入更多对象。 (一) 解决问题 旨在减少大量相似对象创建时的内存开销 (二) 使用场景 大量…

C++的STL常用算法->常用遍历算法、常用查找算法、常用排序算法、常用拷贝和替换算法、常用算术生成算法、常用集合算法

#include<iostream> using namespace std; #include <algorithm> #include <vector> //常用遍历算法 for_each //普通函数 void print01(int val) { cout << val << " "; } //仿函数 //函数对象 class print02 { public: v…

第 2 章 ROS通信机制_通信机制实操(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 2.5.1 实操01_话题发布 需求描述&#xff1a;编码实现乌龟运动控制&#xff0c;让小乌龟做圆周运动。 结果演…

前端工程化面试题 | 16.精选前端工程化高频面试题

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

微信小程序 uniapp+vue餐厅美食就餐推荐系统

本论文根据系统的开发流程以及一般论文的结构分为三个部分&#xff0c;第一个部分为摘要、外文翻译、目录&#xff1b;第二个部分为正文&#xff1b;第三个部分为致谢和参考文献。其中正文部分包括&#xff1a; &#xff08;1&#xff09;绪论&#xff0c;对课题背景、意义、目…

nodejs:nrm(npm的镜像源管理器)

nrm&#xff08;Npm Registry Manager&#xff09;是一个用于快速切换和管理Node.js包管理器npm的镜像源&#xff08;registry&#xff09;的工具。 通过nrm&#xff0c;开发者可以轻松查看当前使用的npm源、添加新的镜像源、测试不同镜像源的速度&#xff0c;并在多个镜像源之…

pdffactory pro 8中文破解版

详细介绍 PdfFactory&#xff0c;PDF文档虚拟打印机&#xff0c;无须Acrobat即可创建Adobe PDF文件&#xff0c;创建PDF文件的方法比其他方法更方便和高效。支持将多个文档整合到一个PDF文件、增加字体和便签、PDF加密、去水印、压缩优化。 FinePrint&#xff0c;Windows虚拟…

mysql json数据模糊查询

场景&#xff1a;当一个列是json字符串时&#xff0c;想模糊查询json字符串中某个字段。 mysql5.7版本已经有了json数据类型&#xff0c;并且有了处理json数据类型的函数。具体看下面的文档地址。这里只说当需要对json中某个字段模糊查询时该怎么写。可以直接用 like的模糊查询…

【DDD】学习笔记-领域模型与数据模型

领域模型与数据模型 领域驱动的设计模型最重要的概念就是聚合&#xff0c;同时&#xff0c;聚合还要受到限界上下文边界的控制。Eric Evans 之所以要引入限界上下文&#xff0c;其中一个重要原因就是因为我们“无法维护一个涵盖整个企业的统一模型”&#xff0c;于是需要限界上…

!!!Python虚拟环境改名后的坑!!!!

搞了一晚上终于弄好这python虚拟环境的问题了&#xff01;真的是坑啊&#xff01; 本来用的纯python环境下的虚拟环境&#xff0c;一时心血来潮&#xff0c;把电脑重新装了一遍&#xff0c;虚拟环境的目录也改了一下&#xff0c;结果虚拟环境再vscode中是可以使用&#xff0c;…

Llama2模型的优化版本:Llama-2-Onnx

Llama2模型的优化版本&#xff1a;Llama-2-Onnx。 Llama-2-Onnx是Llama2模型的优化版本。Llama2模型由一堆解码器层组成。每个解码器层&#xff08;或变换器块&#xff09;由一个自注意层和一个前馈多层感知器构成。与经典的变换器相比&#xff0c;Llama模型在前馈层中使用了不…

Sora领航AIGC时代:深度解读行业变革与AI工具全景图

随着人工智能技术的飞速发展&#xff0c;越来越多的企业和行业开始将AI融入其核心业务流程中。在这个背景下&#xff0c;Sora以其独特的视角和全面的解决方案&#xff0c;正引领着AIGC&#xff08;人工智能生成内容&#xff09;的趋势变革。 本文将对Sora进行深度解读&#xf…