当前位置: 首页 > news >正文

深入理解设计模式-创建型之建造者模式(与工厂区别)

什么是建造者设计模式?和工厂设计模式有什么区别

建造者设计模式(Builder Design Pattern)和工厂设计模式(Factory Design Pattern)都是面向对象设计中的创建型模式,但它们解决的问题和应用场景有所不同。

  • 建造者设计模式:

    • 建造者设计模式旨在解决复杂对象的创建问题,特别是当对象的构造过程非常复杂,需要一步步构建,并且具有多个可选参数或配置选项时。该模式的主要思想是将对象的构建过程表示分离,使得同样的构建过程可以创建不同的表示。
  • 主要组件:

    • Director(指挥者):负责使用构造器接口来构建一个复杂对象。
    • Builder(构造器):定义对象的构建过程,包括设置属性、添加部件等方法。
    • ConcreteBuilder(具体构造器):实现构造器接口,实现具体的构建方法。
    • Product(产品):最终构建出的复杂对象。

建造者模式的优点是将对象的构建过程封装,使得代码更加清晰,同时能够灵活地构建不同的对象。

  • 工厂设计模式:

工厂设计模式旨在通过一个工厂来创建对象,将对象的创建过程封装起来,客户端代码无需直接调用构造函数。它分为简单工厂、工厂方法和抽象工厂等形式。

  • 主要组件:

    • Factory(工厂):负责创建对象的接口或类。
    • ConcreteFactory(具体工厂):实现工厂接口,实际创建对象的地方。
    • Product(产品):工厂创建的对象。

工厂模式的主要优点是将对象的创建和客户端解耦,客户端只需通过工厂来获取对象,不需要关心对象的具体创建过程。

区别

  • 目的不同:

    • 建造者模式关注于创建复杂对象的构建过程,将构建过程和表示分离。
    • 工厂模式关注于对象的创建,将对象的创建过程封装在工厂中,以便在客户端中使用。
  • 复杂性:

    • 建造者模式通常用于创建复杂对象,因为对象的构建过程可能涉及多个步骤和配置选项。
    • 工厂模式可以用于创建不同类型的对象,包括简单对象和复杂对象。
  • 关注点:

    • 建造者模式更关注于对象的**构建过程,**尤其适合需要按照一定步骤构建对象的情况。
    • 工厂模式更关注于对象的创建,强调封装创建过程,便于对象创建的管理。

综上所述,建造者模式适用于构建复杂对象,而工厂模式适用于创建对象的封装和管理。选择适当的模式取决于你的设计需求和对象创建的复杂性。

用java分别给出一个建造者和工厂例子

当实现建造者模式和工厂模式时,我们可以以一个简单的示例来说明。假设我们要创建一个电脑对象,分别使用建造者模式和工厂模式。

建造者模式示例:

// 产品类
class Computer {private String cpu;private String memory;private String storage;public void setCPU(String cpu) {this.cpu = cpu;}public void setMemory(String memory) {this.memory = memory;}public void setStorage(String storage) {this.storage = storage;}// 其他方法...
}// 抽象建造者
interface ComputerBuilder {void buildCPU();void buildMemory();void buildStorage();Computer getResult();
}// 具体建造者
class GamingComputerBuilder implements ComputerBuilder {private Computer computer = new Computer();//产品类对象public void buildCPU() {computer.setCPU("Intel Core i7");}public void buildMemory() {computer.setMemory("16GB RAM");}public void buildStorage() {computer.setStorage("1TB SSD");}public Computer getResult() {return computer; //需要一步步创建(具体怎么创建指挥者说了算) 最后通过此方法返回Computer产品对象}
}// 指挥者
class Director {private ComputerBuilder builder;//接口类型public Director(ComputerBuilder builder) {this.builder = builder;}public void construct() {builder.buildCPU(); //指挥建造者来一步步创建builder.buildMemory();builder.buildStorage();}
}// 客户端代码
public class BuilderExample {public static void main(String[] args) {ComputerBuilder builder = new GamingComputerBuilder();//父类引用(这里是接口)指向子类对象(抽象建造者引用指向具体建造者)Director director = new Director(builder);//builder建造者对象传入指挥者对象director.construct();//指挥者调用创建方法(此时指挥者已经 指挥建造者builder完成了创建即construct())Computer computer = builder.getResult();//建造者对象调用方法 返回产品类对象// 使用构建好的电脑对象System.out.println("Gaming Computer: " + computer.toString());}
}

工厂模式示例:

// 产品类
class Computer {private String type;private String cpu;private String memory;private String storage;public Computer(String type, String cpu, String memory, String storage) {this.type = type;this.cpu = cpu;this.memory = memory;this.storage = storage;}// 其他方法...
}// 抽象工厂
interface ComputerFactory {Computer createComputer();
}// 具体工厂
class GamingComputerFactory implements ComputerFactory {public Computer createComputer() {return new Computer("Gaming", "Intel Core i7", "16GB RAM", "1TB SSD");}
}// 客户端代码
public class FactoryExample {public static void main(String[] args) {ComputerFactory factory = new GamingComputerFactory();//父类引用(这里是接口)指向子类对象Computer computer = factory.createComputer();//从具体工厂中直接拿对象// 使用工厂创建的电脑对象System.out.println("Gaming Computer: " + computer.toString());}
}

在上述示例中,建造者模式通过在建造者接口中定义构建步骤来构建复杂对象,而工厂模式通过工厂接口的具体实现来创建对象。两者在对象创建的过程和角色分配上有所不同。

源码应用

创建者设计模式在源码中有广泛的使用常见:

1、jdk中,如StringBuilder和StringBuffer,他们的实现不是完全按照标准的创建者设计模式设计,但也是一样的思想:

  • 这两个类用于构建和修改字符串。它们实现了创建者模式,允许客户端通过方法链来修改字符串。
  • 这些类在性能上优于 String 类,因为它们允许在同一个对象上执行多次修改,而不需要每次修改都创建一个新的对象。
StringBuilder builder = new StringBuilder();builder.append("Hello").append(" ").append("World!");String result = builder.toString();

2、在ssm源码中很多类都使用创建者设计模式,如Spring中的

BeanDefinitionBuilder 类,mybatis中的 SqlSessionFactoryBuilder 、XMLConfigBuilder 、 XMLMapperBuilder 、 XMLStatementBuilder 、CacheBuilder 等,因为实现都比较简单就不带着大家一个一个看了。

3、使用lombok简单的实现创建者设计模式

Lombok 是一个 Java 库,它可以简化代码,提高开发效率,尤其是在实现模式和生成常用方法(例如 getter、setter、equals、hashCode 和 toString)时。要使用 Lombok 简单地实现创建者设计模式,您可以使用 @Builder 注解。这将为您自动生成创建者类和相关方法。以下是一个使用 Lombok 的创建者设计模式的例子:
首先,确保您已经在项目中引入了 Lombok 库。对于 Maven 项目,在 pom.xml 文件中添加以下依赖:

<dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><scope>provided</scope></dependency>
</dependencies>

然后,创建一个使用 Lombok 的创建者设计模式的类:

@Getter
@ToString
@Builderpublic class Person {private String name;private int age;private String address;
}

在上面的示例中,我们使用了 @Builder 注解来自动生成创建者类和相关方法。此外,我们还使用了 @Getter 注解来自动生成 getter 方法,以及 @ToString 注解来自动生成 toString 方法。
现在,您可以使用自动生成的创建者类创建 Person 对象:

Person person = Person.builder().name("John Doe").age(30).address("123 Main St").build();

通过 Lombok,您可以轻松地实现创建者设计模式,减少样板代码,提高代码可读性。

相关文章:

深入理解设计模式-创建型之建造者模式(与工厂区别)

什么是建造者设计模式&#xff1f;和工厂设计模式有什么区别 建造者设计模式&#xff08;Builder Design Pattern&#xff09;和工厂设计模式&#xff08;Factory Design Pattern&#xff09;都是面向对象设计中的创建型模式&#xff0c;但它们解决的问题和应用场景有所不同。…...

Centos7多台服务器免密登录

准备四台服务器: docker0 docker1 docker2 docker3 在docker0服务器上生成公钥和私钥 [rootwww ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Created directory /root/.ssh. Enter passp…...

C语言实现哈希搜索算法

一、哈希搜索算法原理 哈希搜索&#xff0c;也叫散列查找&#xff0c;是一种通过哈希表&#xff08;散列表&#xff09;实现快速查找目标元素的算法。哈希搜索算法通常适用于需要快速查找一组数据中是否存在某个元素的场景&#xff0c;其时间复杂度最高为 O(1)&#xff0c;而平…...

MySQL卸载并重装指定版本

MySQL卸载并重装制定版本 学习新的项目&#xff0c;发现之前的Navicat已经失去了与现有MySQL的链接&#xff0c;而且版本也不适合&#xff0c;为了少走弯路&#xff0c;准备直接重装相应版本的MySQL 卸载现有MySQL 停止windows的MySQL服务&#xff0c;【windowsR】打开运行框…...

文件IO编程 1 2

头文件包含路径 linux 操作系统分为两大空间&#xff1a;用户空间和内核空间 这样划分&#xff0c;是为了保护内核的核心组件&#xff0c;不被轻易访问和修改 系统调用&#xff1a;安全的访问内核空间 其核心是&#xff1a;函数API&#xff08;API&#xff1a;用户编程接口&…...

Java后端框架模块整合

提示&#xff1a;使用Java后端开发框架能够提高开发效率、代码质量&#xff0c;提升可扩展性&#xff0c;降低开发成本和易于维护。 文章目录 前言MyBatis 框架知识Spring 框架知识SpringMVC 框架知识SpringBoot 框架知识 前言 提示&#xff1a;这里可以添加本文要记录的大概内…...

17 synchronized关键字使用 synchronized方法、synchronized块

synchronized方法、synchronized块 线程的同步不安全的线程示例1&#xff1a;示例2示例3 synchronized方法、synchronized块 线程的同步 并发&#xff1a;同一个对象被多个线程同时操作。 解决方案&#xff1a;让多个线程排队操作对象。 使用队列和锁解决多线程的并发问题。 同…...

django-基本环境配置

文章目录 django 环境安装1. 安装环境1.1 安装 Python (配置虚拟环境)1.1.1 步骤 1.2 Conda配置环境参考 django 环境安装 1. 安装环境 1.1 安装 Python (配置虚拟环境) 由于国外源速度慢&#xff0c;可以pip添加清华源 pip config set global.index-url https://pypi.tuna.…...

Springboot 实践(4)swagger-ui 测试controller

前文项目操作&#xff0c;完成了项目的创建、数据源的配置以及数据库DAO程序的生成与配置。此文讲解利用swagger-ui界面&#xff0c;测试生成的数据库DAO程序。目前&#xff0c;项目swagger-ui界面如下&#xff1a; 以”用户管理”为例&#xff0c;简单讲述swagger-ui测试数据库…...

PHP实践:分布式场景下的Session共享解决方案实现

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责…...

07 - 查看、创建、切换和删除分支

查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;GIT常用场景- 目录 文章目录 1. 查看分支2. 创建和切换分支3. 删除分支 1. 查看分支 git branch -va2. 创建和切换分支 第一种&#xff1a; 创建分支&#xff1a; git branch new_branch切换分支&#xff1a; …...

【SpringBoot】89、SpringBoot中使用@Transactional进行事务管理

事务是一组组合成逻辑工作单元的操作,虽然系统中可能会出错,但事务将控制和维护事务中每个操作的一致性和完整性。 1、SpringBoot 引用说明 新建的 Spring Boot 项目中,一般都会引用 spring-boot-starter 或者 spring-boot-starter-web,而这两个起步依赖中都已经包含了对…...

两天入门Linux、搭建Spring环境 第一天

一、Linux简介 1.什么是Linux 一个操作系统&#xff0c;未来公司里面会用到、接触的新操作系统。 2.为什么学Linux (1)个人职务需要&#xff0c;肯定会接触到Linux (2)职业发展&#xff0c;以后的发展肯定需要掌握Linux的许多使用方法 3.学哪些内容 (1)Linux基本介绍 (2)…...

OpenCV实例(九)基于深度学习的运动目标检测(一)YOLO运动目标检测算法

基于深度学习的运动目标检测&#xff08;一&#xff09; 1.YOLO算法检测流程2.YOLO算法网络架构3.网络训练模型3.1 训练策略3.2 代价函数的设定 2012年&#xff0c;随着深度学习技术的不断突破&#xff0c;开始兴起基于深度学习的目标检测算法的研究浪潮。 2014年&#xff0c;…...

CI/CD流水线实战

不知道为什么&#xff0c;现在什么技术都想学&#xff0c;因为我觉得我遇到了技术的壁垒&#xff0c;大的项目接触不到&#xff0c;做的项目一个字辣*。所以&#xff0c;整个人心浮气躁&#xff0c;我已经得通过每天的骑行和长跑缓解这种浮躁了。一个周末&#xff0c;我再次宅在…...

详解配置交换机多生成树MSTP+VRRP 的典型组网

详解配置交换机多生成树MSTPVRRP 的典型组网 组网&#xff1a; 1. 这是一个由三台交换机组成的倒三角型二层交换网络&#xff1b;网络中有4个VLAN&#xff1a;10、20、30、40&#xff1b;接口编号如图所示&#xff1b;SW3为接入层交换机&#xff0c;SW1、SW2为汇聚层交换机&am…...

二.net core 自动化发布到docker (Jenkins安装之后向导)

目录 ​​​​​​​​​​​​​​ 参考资料&#xff1a;https://www.jenkins.io/doc/book/installing/docker/#setup-wizard Post-installation setup wizard.(安装后安装向导) 基于上一篇文章安装&#xff0c;在安装并运行Jenkins&#xff08;不包括使用Jenkins Opera…...

【设计模式——学习笔记】23种设计模式——解释器模式Interpreter(原理讲解+应用场景介绍+案例介绍+Java代码实现)

案例引入 通过解释器模式来实现四则运算&#xff0c;如计算ab-c的值&#xff0c;具体要求 先输入表达式的形式&#xff0c;比如abc-de&#xff0c;要求表达式的字母不能重复在分别输入a,b,c,d,e的值最后求出结果 传统方案 编写一个方法&#xff0c;接收表达式的形式&#xf…...

【计算机网络】——数据链路层

二、组帧 1、字符计数法 帧头部使用一个字符来表示帧的大小(包括第一个计数字符) &#xff08;此处一字符一个字节&#xff09; 2、字符填充收尾定界法 特定字符来定界帧的首和尾。若帧中数据段出现等同于特定字符的字符内容&#xff0c;前置一个转义字符。(类似于正则表达…...

数据结构:栈和队列(超详细)

目录 ​编辑 栈&#xff1a; 栈的概念及结构&#xff1a; 栈的实现&#xff1a; 队列&#xff1a; 队列的概念及结构&#xff1a; 队列的实现&#xff1a; 扩展知识&#xff1a; 以上就是个人学习线性表的个人见解和学习的解析&#xff0c;欢迎各位大佬在评论区探讨&#…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端&#xff08;即页面 JS / Web UI&#xff09;与客户端&#xff08;C 后端&#xff09;的交互机制&#xff0c;是 Chromium 架构中非常核心的一环。下面我将按常见场景&#xff0c;从通道、流程、技术栈几个角度做一套完整的分析&#xff0c;特别适合你这种在分析和改…...

【堆垛策略】设计方法

堆垛策略的设计是积木堆叠系统的核心&#xff0c;直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法&#xff0c;涵盖基础规则、优化算法和容错机制&#xff1a; 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则&#xff1a; 大尺寸/重量积木在下&#xf…...

C++_哈希表

本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、基础概念 1. 哈希核心思想&#xff1a; 哈希函数的作用&#xff1a;通过此函数建立一个Key与存储位置之间的映射关系。理想目标&#xff1a;实现…...