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

【设计模式】 建造者模式和原型模式

建造者模式(Builder Pattern)

概述

建造者模式是一种创建型设计模式,它允许逐步构建复杂对象。通过将构造过程与表示分离,使得同样的构建过程可以创建不同的表示。这种模式非常适合用于创建那些具有很多属性的对象,尤其是当有些属性是可选的时候。

优点
  • 可以控制一个产品的创建过程
  • 提供代码的复用性。
  • 支持变化:可以在不修改已有代码的情况下,对构建过程进行扩展或修改。
实现示例
// 产品类
class Car {private String brand;private String model;private int year;// 私有构造函数private Car(Builder builder) {this.brand = builder.brand;this.model = builder.model;this.year = builder.year;}// 静态内部类作为建造者public static class Builder {private String brand;private String model;private int year;public Builder setBrand(String brand) {this.brand = brand;return this;}public Builder setModel(String model) {this.model = model;return this;}public Builder setYear(int year) {this.year = year;return this;}public Car build() {return new Car(this);}}@Overridepublic String toString() {return "Car{" +"brand='" + brand + '\'' +", model='" + model + '\'' +", year=" + year +'}';}
}// 客户端代码
public class BuilderPatternDemo {public static void main(String[] args) {Car car = new Car.Builder().setBrand("BMW").setModel("X5").setYear(2022).build();System.out.println(car);}
}

原型模式(Prototype Pattern)

概述

原型模式是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而不是通过实例化。这在需要创建对象的开销较大时非常有用,因为它可以通过简单的复制来避免高昂的初始化成本。

优点
  • 性能提高:克隆对象比使用new关键字创建对象效率更高,尤其是在创建大量相似对象时。
  • 绕过构造函数:直接复制对象而不需要调用构造函数。
实现示例

Java中的原型模式通常使用Cloneable接口和Object.clone()方法实现。

// 原型接口
interface Prototype extends Cloneable {Prototype clone() throws CloneNotSupportedException;
}// 具体原型类
class Car implements Prototype {private String brand;private String model;public Car(String brand, String model) {this.brand = brand;this.model = model;}@Overridepublic Prototype clone() throws CloneNotSupportedException {return (Prototype) super.clone();  // 浅克隆}@Overridepublic String toString() {return "Car{" +"brand='" + brand + '\'' +", model='" + model + '\'' +'}';}
}// 客户端代码
public class PrototypePatternDemo {public static void main(String[] args) {try {Car originalCar = new Car("BMW", "X5");Car clonedCar = (Car) originalCar.clone();System.out.println("Original: " + originalCar);System.out.println("Cloned: " + clonedCar);} catch (CloneNotSupportedException e) {e.printStackTrace();}}
}

在Java项目中的应用

  • 建造者模式常被用于构建复杂的对象,例如Lombok包中的@Builder,是实体类支持建造者模式;在Google的Guava库中,ImmutableList.builder()也是一个很好的例子,它允许用户以灵活的方式构建不可变列表。

  • 原型模式在Java的标准库中有广泛的应用,比如java.lang.Object#clone()方法就是原型模式的一个具体实现;以及常用的Hutool工具包中的BeanUtil中的copyProperties常用来实现对象拷贝

相关文章:

【设计模式】 建造者模式和原型模式

建造者模式(Builder Pattern) 概述 建造者模式是一种创建型设计模式,它允许逐步构建复杂对象。通过将构造过程与表示分离,使得同样的构建过程可以创建不同的表示。这种模式非常适合用于创建那些具有很多属性的对象,尤…...

win7误删注册表文件夹导致exe无法执行

今天在装某个软件的时候报错 “不是有效的Win32应用程序”,找一篇文章于是按文章删除了注册表上的好多文件,之后就发现所有的exe文件都打不开了,更糟糕的是中间还弹出来一个“是否将IE设置为所有程度的默认执行程序”,没思考就点击…...

【ESP32接入国产大模型之Deepseek】

【ESP32接入国产大模型之Deepseek】 1. Deepseek大模型1.1 了解Deepseek api1.2 Http接口鉴权1.3. 接口参数说明1.3.1 请求体(request)参数1.3.2 模型推理 2. 先决条件2.1 环境配置2.2 所需零件 3. 核心代码3.1 源码分享3.2 源码解析3.3 连续对话修改后的代码代码说明示例输出注…...

C语言蓝桥杯1003: [编程入门]密码破译

要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母. 例如,字母"A"后面第4个字母是"E"."E"代替"A"。因此,"China"应译…...

New Game--(单调队列)

I - New Game 有一种新的游戏,Monocarp 想要玩。这个游戏使用一副包含 n 张牌的牌堆,其中第 i 张牌上写有一个整数 a_i。 在游戏开始时,Monocarp 可以在第一轮选择牌堆中的任意一张牌。在接下来的每一轮中,Monocarp 可以选择一张…...

什么是偏光环形光源

偏光环形光源是一种特殊的光源,常用于机器视觉、光学检测和工业自动化等领域。它结合了环形光源和偏光技术,能够有效减少反射、增强对比度,特别适用于检测高反光或表面复杂的物体。 主要特点: 环形设计:光线均匀照射物…...

SolidWorks速成教程P3-3【零件 | 第三节】——草图绘制面实线与构造线的区别

经过了前面的特征学习后,是不是感觉对 SolidWorks越来越熟悉了?不过发现, SolidWorks速成这套教程,对于一些基础问题,还是需要解释得更详细一些,所以在这节再补充一下草图绘制面&实线与构造线的区别。 目录 1.草图绘制面 2.实线与构造线的区别 1.草图绘制面 之前…...

win10中mstsc远程Centos-Stream 9图形化界面

文章目录 1 前置状态2 安装配置XRDP3 关闭SELinux3.1 查看selinux状态3.2 关闭selinux 4 启动XRDP5 Win10远程连接测试 1 前置状态 已安装CentOS9桌面版;Windows10。 2 安装配置XRDP sudo yum install epel-release sudo yum install xrdp sudo yum install tige…...

中国AI“拥抱开源”给世界的启示——Anko

事实证明,中国AI企业“拥抱开源”,不仅为自身发展开拓了新路径,也带动AI企业跨国合作的需求,并推动全球AI生态向“开源普惠”转型。Anko通过免费开放部分模型功能,将AI时代的数字红利公平地派发到每一位网民手中&#…...

DeepSeek处理自有业务的案例:让AI给你写一份小众编辑器(EverEdit)的语法着色文件

1 DeepSeek处理自有业务的案例:让AI给你写一份小众编辑器(EverEdit)的语法着色文件 1.1 背景 AI能力再强,如果不能在企业的自有业务上产生助益,那基本也是一无是处。将企业的自有业务上传到线上训练,那是脑子进水的做法&#xff…...

Jenkins 配置 Git Parameter 四

Jenkins 配置 Git Parameter 四 一、开启 项目参数设置 勾选 This project is parameterised 二、添加 Git Parameter 如果此处不显示 Git Parameter 说明 Jenkins 还没有安装 Git Parameter plugin 插件,请先安装插件 Jenkins 安装插件 三、设置基本参数 点击…...

力扣-二叉树-110 平衡二叉树

思路 用后序分别求出每一个节点的左子树和右子树高度,然后判断是否符合定义,再判断两个子树是否符合定义 代码 class Solution { public:int getDepth(TreeNode* node){if(node nullptr) return 0;return max( getDepth(node->left), getDepth(no…...

Linux 查看磁盘中的大文件

在 Linux 系统中,你可以使用以下方法来查看磁盘中的大文件信息: 1. 使用 find 命令 find 命令可以递归查找指定目录下的大文件。 find /path/to/directory -type f -size 100M -exec ls -lh {} \;/path/to/directory:要查找的目录路径&…...

网络工程师 (38)流量和差错控制

一、流量控制 流量控制是一种协调发送站和接收站工作步调的技术。它的主要目的是防止发送端发送数据过快,导致接收端缓冲区溢出,从而造成数据丢失。流量控制机制通过调整发送速率来匹配接收端的处理能力。 基本原理 发送站每发出一帧数据,就进…...

vue3多个页面/组件,复用同一段render页面根据接口返回的数据动态渲染逻辑,使用setup+组合式API

组件reusableComponent是可供多个组件复用的 getData请求接口&#xff0c;render渲染数据 <template><render /> </template> <script setup> import operationService from "/views/operation/component/operationService.vue";const prop…...

从零开始:Django初学者的实战之旅

一、概念引入 要基于编程开发一个完整的企业项目不管什么样的项目&#xff0c;基本都有3种不同的开发模式&#xff0c;这几种开发模式&#xff0c;如果把项目类比成建造房子则有如下&#xff1a; 1.原生开发&#xff1a;类似从0开始造房子&#xff0c;从0开始构建项目&#xf…...

青果教务系统逆向(js逆向)

首先我们打开f12检查以下登录函数 可以看到登录函数在checkrand中&#xff0c;直接去全局搜索函数 在这里&#xff0c;打个断点直接跳进去 可以看到参数在这里形成 这是我们发起请求需要的参数&#xff0c;把这几个参数加进去直接登录就行 那就一个一个看呗&#xff0c;第一…...

在Linux中Redis不支持lua脚本的处理方法

redis安装在IP为x.x.x.x的服务器上 redis安装 第一步&#xff0c;安装前&#xff0c;检测系统是否安装了redis。若安装了redis&#xff0c;则需要删除redis&#xff1b;若没有安装redis&#xff0c;则需要安装2.6版本以上的redis。 # 确保Redis版本支持Lua脚本。从Redis 2.6…...

WPF进阶 | 深入 WPF 依赖项属性:理解其强大功能与应用场景

WPF进阶 | 深入 WPF 依赖项属性&#xff1a;理解其强大功能与应用场景 前言一、依赖项属性基础概念1.1 什么是依赖项属性1.2 依赖项属性与 CLR 属性的区别1.3 依赖项属性的定义与注册 二、依赖项属性的原理深入剖析2.1 依赖项属性系统的工作机制2.2 元数据&#xff08;Metadata…...

关于 IoT DC3 中设备(Device)的理解

在物联网系统中&#xff0c;设备&#xff08;Device&#xff09;是一个非常宽泛的概念&#xff0c;它可以指代任何能够接入系统并进行数据交互的实体。包括但不限于手机、电脑、服务器、网关、硬件设备甚至是某些软件程序等所有能接入到该平台的媒介。 内容 定义 目的 示例 …...

从 0 开始本地部署 DeepSeek:详细步骤 + 避坑指南 + 构建可视化(安装在D盘)

个人主页&#xff1a;chian-ocean 前言&#xff1a; 随着人工智能技术的迅速发展&#xff0c;大语言模型在各个行业中得到了广泛应用。DeepSeek 作为一个新兴的 AI 公司&#xff0c;凭借其高效的 AI 模型和开源的优势&#xff0c;吸引了越来越多的开发者和企业关注。为了更好地…...

Uniapp 获取定位详解:从申请Key到实现定位功能

文章目录 前言一、申请定位所需的 Key1.1 注册高德开发者账号1.2 创建应用1.3 添加 Key 二、在 Uniapp 中配置定位功能2.1 引入高德地图 SDK2.2 获取定位权限 三、实现定位功能3.1 使用 uni.getLocation 获取位置3.2 处理定位失败的情况3.3 持续定位3.4 停止持续定位 四、总结 …...

【6】阿里面试题整理

[1]. ThreadLocal原理 ThreadLocal提供了一种线程隔离的机制&#xff0c;使得每个线程拥有自己独立的变量副本。 它的底层实现是ThreadLocalMap&#xff0c;以ThreadLocal对象为键&#xff0c;变量副本为值的键值对。 为了避免内存泄漏&#xff0c;ThreadLocalMap的Key使用了…...

Spring系统学习——持续更新

spring概述 1.轻量级的开源的JAVAEE框架 2.解决企业应用开发的复杂性 3.两大核心 &#xff1a;IOC&#xff08;控制反转&#xff09;和AOP&#xff08;面向切面&#xff09; 4.Spring特点&#xff1a; 1.方便解耦&#xff0c;简化开发。2.Aop编程支持3.方便程序测试4.方便和其…...

【自学笔记】机器学习基础知识点总览-持续更新

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 机器学习重点知识点总览一、机器学习基础概念二、机器学习理论基础三、机器学习算法1. 监督学习2. 无监督学习3. 强化学习 四、机器学习处理流程五、机器学习常见问…...

QT笔记——QRadioButton

文章目录 1、概要2、实际的应用2.1、创建多个QRadioButton,只可同时选中其中一个&#xff0c;点击后实现对应的槽函数 1、概要 实现QRadioButton相关的应用&#xff1b;2、实际的应用 2.1、创建多个QRadioButton,只可同时选中其中一个&#xff0c;点击后实现对应的槽函数 创建…...

微服务面试题:远程调用

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…...

共享设备管理难?MDM助力Kiosk模式一键部署

目录 1. 简化设备部署与配置&#xff1a;实现一键式部署 2. 自动化应用更新与内容推送&#xff1a;确保设备始终保持最新状态 3. 权限控制与设备安全&#xff1a;防止滥用与数据泄露 4. 远程管理与故障诊断&#xff1a;保障设备长期稳定运行 5. 数据分析与报告&#xff1a…...

C++17 中的 std::reduce:详细教程

文章目录 1. 简介2. 函数签名3. 使用场景3.1 简单的累加操作3.2 自定义归并操作3.3 并行计算的性能优势 4. 注意事项4.1 归并操作的结合律和交换律4.2 默认值的使用 5. 总结 1. 简介 std::reduce 是 C17 标准库中引入的一个算法&#xff0c;用于对范围内的元素进行归并操作。它…...

Navicat导入海量Excel数据到数据库(简易介绍)

目录 前言正文 前言 此处主要作为科普帖进行记录 原先Java处理海量数据的导入时&#xff0c;由于接口超时&#xff0c;数据处理不过来&#xff0c;后续转为Navicat Navicat 是一款功能强大的数据库管理工具&#xff0c;支持多种数据库系统&#xff08;如 MySQL、PostgreSQL、…...