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

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

建造者设计模式(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,您可以轻松地实现创建者设计模式,减少样板代码,提高代码可读性。

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

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

相关文章

原码、反码、补码,进制转换,有符号数和无符号数转换

计算机底层存储数据时&#xff0c;存储的是数据对应的二进制数字。对于整型数据&#xff0c;其二进制表示形式有三种&#xff0c;分别是&#xff1a;原码、反码、补码&#xff0c;而实际存储的是整型数据的补码。 原码、反码以及补码都是有符号的&#xff0c;其中最高位存放符…

带你掌握Stable Diffution商业级玩法

课程介绍 学习地址 《Stable Diffusion商业级玩法》通过详细讲解AI绘画技巧、实操演示和个性化指导&#xff0c;帮助您从零基础成为绘画高手&#xff0c;帮助您有效推广产品或服务&#xff0c;提升市场份额。教您掌握稳定扩散绘画技巧&#xff0c;开启艺术创作新篇章。

Opencv 之ORB特征提取与匹配API简介及使用例程

Opencv 之ORB特征提取与匹配API简介及使用例程 ORB因其速度较快常被用于视觉SLAM中的位姿估计、视觉里程、图像处理中的特征提取与匹配及图像拼接等领域本文将详细给出使用例程及实现效果展示 1. API 简介 创建 static Ptr<ORB> cv::ORB::create (int nfeatures 500…

无涯教程-Perl - use函数

描述 此函数将MODULE导出的所有功能(或仅LIST引用的功能)导入当前包的名称空间。有效等效于- BEGIN { require "Module.pm"; Module->import(); }也用于在当前脚本上强加编译器指令(编译指示),尽管从本质上讲它们只是模块。 请注意,use语句在编译时进行判断。在…

springcloud3 hystrix实现服务熔断的案例配置3

一 hystrix的熔断原理 1.1 hystrix的熔断原理 在springcloud的框架里&#xff0c;熔断机制是通过hystrix实现&#xff0c;hystrix会监控服务之间的调用。当失败调用达到一定的阈值&#xff0c;默认是5s内失败20次&#xff0c;就会启用hystrix的熔断机制&#xff0c;使用命Hy…

神经网络基础-神经网络补充概念-44-minibatch梯度下降法

概念 小批量梯度下降法&#xff08;Mini-Batch Gradient Descent&#xff09;是梯度下降法的一种变体&#xff0c;它结合了批量梯度下降&#xff08;Batch Gradient Descent&#xff09;和随机梯度下降&#xff08;Stochastic Gradient Descent&#xff09;的优点。在小批量梯…

Apache Doris大规模数据使用指南

目录 发展历史 架构介绍 弹性MPP架构-极简架构 逻辑架构 基本访问架构 分区 创建单分区表

【C++ 记忆站】缺省参数

文章目录 缺省参数的概念缺省参数的分类1、全缺省参数2、半缺省参数 缺省参数实际应用场景 缺省参数的概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参 正常调用一…

音频解码及如何在Java实现

本人并不干这个&#xff0c;但是被迫下水了解了一下这个&#xff0c;稍微做了一下整理。再就是感觉现在网上以及ChatGPT在这方面给出的答案太水了&#xff0c;在此开辟一篇。无意放出代码&#xff0c;这里只介绍一些可能重要的点。 本来以为有了ChatGPT写这些就没有必要了&…

Docker部署ES服务,canal全量同步的时候内存爆炸,ES/Canal Adapter自动关闭,CPU100%

文章目录 问题解决方案1. 对ES的限制2. 对Canal-Adapter的限制 问题 使用canal-adapter全量同步&#xff08;参考Canal Adapter1.1.5版本API操作服务&#xff0c;手动同步数据&#xff08;4&#xff09;&#xff09;的时候 小批量数据可以正常运行&#xff08;几千条&#xf…

Llama 2免费托管及API提供

Llama 2 是 Meta 最新的文本生成模型&#xff0c;目前其性能优于所有开源替代方案。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 1、强大的Llama 2 它击败了 Falcon-40B&#xff08;之前最好的开源基础模型&#xff09;&#xff0c;与 GPT-3.5 相当&#xff0c;仅低…

【uni-app】 .sync修饰符与$emit(update:xxx)实现数据双向绑定

最近在看uni-app文档&#xff0c;看到.sync修饰符的时候&#xff0c;觉得很有必要记录一下 其实uni-app是一个基于Vue.js和微信小程序开发框架的跨平台开发工具 所以经常会听到这样的说法&#xff0c;只要你会vue&#xff0c;uni-app就不难上手 在看文档的过程中&#xff0c;发…

.netcore grpc客户端工厂及依赖注入使用

一、客户端工厂概述 gRPC 与 HttpClientFactory 的集成提供了一种创建 gRPC 客户端的集中方式。可以通过依赖包Grpc.Net.ClientFactory中的AddGrpcClient进行gRPC客户端依赖注入AddGrpcClient函数提供了许多配置项用于处理一些其他事项&#xff1b;例如AOP、重试策略等 二、案…

miniExcel 生成excel

一、nuget dotnet add package MiniExcel --version 1.31.2 二、新建表及数据 ExampleProducts 三、这里我用了Dapper.Query方法 读取excel public virtual async Task<IActionResult> Anonymous(){try{//using (var connection _dbContext.GetDbConnection())//{//…

linux中的ifconfig和ip addr

在linux操作系统中ifconfig和ip addr都是显示网卡配置信息的命令&#xff0c;好多人有疑惑它们有什么区别呢 区别1&#xff1a;对于linux发行的版本不一样 ip addr是对新发行版本的linux使用会比较多&#xff1b;而ifconfig是老版本遇到使用的会比较多。 区别2&#xff1a;显…

神经网络基础-神经网络补充概念-32-神经网络与大脑

概念 神经网络&#xff08;Neural Networks&#xff09;是受到生物神经系统启发而设计的机器学习模型&#xff0c;用于处理和学习复杂的数据模式。尽管神经网络的设计和工作原理与大脑有一些相似之处&#xff0c;但它们并不完全相同&#xff0c;以下是神经网络和大脑之间的一些…

基于 KubeSphere 的应用容器化在智能网联汽车领域的实践

公司简介 某国家级智能网联汽车研究中心成立于 2018 年&#xff0c;是担当产业发展咨询与建议、共性技术研发中心、创新成果转化的国家级创新平台&#xff0c;旨在提高我国在智能网联汽车及相关产业在全球价值链中的地位。 目前着力建设基于大数据与云计算的智能汽车云端运营…

RestTemplate

RestTemplate介绍 RestTemplate是Spring提供的用于访问RESTful服务的客户端&#xff0c;RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。RestTemplate默认依赖JDK提供http连接的能力&#xff08;HttpURLConnection&#xff09;&#xff0c;…

js拼接字符串

在js中&#xff0c;你可以使用字符串拼接的方式创建新的字符串。 下面是一些常用的方法&#xff1a; 1、使用运算符&#xff1a; var str1 "Hello"; var str2 "World"; var result str1 " " str2; console.log(result); // 输出&#xf…

【数据结构】链表常见题目

文章目录 链表合并两个有序链表反转链表复制带随机指针的链表环形链表环形链表II相交链表移除链表元素链表中倒数第k个节点链表分割链表的回文结构链表的中间节点旋转链表链表排序链表求和 (逆序求)链表求和II (正序求)重排链表奇偶链表反转链表II <==> 链表内指定区间反…