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

原型模式和建造模式的区别

        原型模式(Prototype Pattern)和建造者模式(Builder Pattern)虽然都是创建型设计模式,但它们的应用场景和实现方式有着显著的区别。以下是二者的详细对比:

1. 意图和应用场景

  • 原型模式:
    • 意图:通过克隆一个现有的对象来创建新对象,而不是通过实例化类来创建新对象。
    • 应用场景:
      • 当创建对象的过程非常复杂或昂贵时,可以通过复制(克隆)现有的实例来创建新对象。
      • 如果系统中有许多具有相似状态的对象,原型模式可以通过复制现有对象节省初始化时间。
      • 适合动态加载类或对象时,用于避免依赖具体的构造函数或复杂的初始化流程。
  • 建造者模式:
    • 意图:将复杂对象的构建过程分离出来,使得相同的构建过程可以创建不同的对象。
    • 应用场景:
      • 当对象的创建过程复杂且涉及多个步骤时,通过建造者模式可以控制创建过程。
      • 特别适合构建复杂的对象(通常包含多个子对象或多个可选参数)。
      • 适用于需要通过不同配置来创建不同种类对象的场景(例如创建同一个产品的不同版本)。

2. 创建对象的方式

  • 原型模式:
    • 通过复制(克隆)对象来创建新对象。复制操作可以是浅拷贝或深拷贝。
    • 主要关注对象的复制过程,而不是构建过程。
    • 通常需要实现 clone() 方法或类似的克隆机制来复制对象。
  • 建造者模式:
    • 通过构造步骤逐步构建对象。这个过程将对象的创建过程与表示过程解耦,允许一步一步地配置对象。
    • 主要关注构建过程中的不同步骤和顺序,并且允许通过同一个构造过程生成不同的对象。
    • 通常使用一个 Builder 类来定义构建的步骤和最终产品的生成。

3. 结构上的区别

  • 原型模式:
    • 原型模式的核心是对象本身,它使用现有的对象作为原型,通过克隆的方式生成新对象。
    • 类结构较为简单,通常只涉及一个需要克隆的对象类。
  • 建造者模式:
    • 建造者模式有清晰的角色划分,通常包括:
      • Builder:定义了构建产品的抽象步骤。
      • ConcreteBuilder:实现具体的构建步骤。
      • Director(可选):负责控制对象构建的顺序。
      • Product:最终生成的对象。
    • 结构较复杂,因为构建过程需要清晰的步骤和相应的实现。

4. 修改对象状态的方式

  • 原型模式:
    • 对象状态是通过克隆现有对象,然后可能在新对象上进行少量修改来实现的。
    • 这种模式下,通常不涉及构建复杂对象的多个步骤,而是从已有的对象开始,进行轻微的调整。
  • 建造者模式:
    • 对象状态的创建是通过一系列构建步骤来完成的。这些步骤可以独立控制,允许在构造过程中自由地改变对象的状态。
    • 对象的不同部分可以通过不同的步骤来进行定制,构建过程可以灵活调整。

5. 代码示例

原型模式示例(C++):

#include <iostream>
#include <string>
#include <memory>class Prototype {
public:virtual ~Prototype() {}virtual std::shared_ptr<Prototype> clone() const = 0;virtual void print() const = 0;
};class ConcretePrototype : public Prototype {
private:std::string name;public:ConcretePrototype(const std::string& name) : name(name) {}std::shared_ptr<Prototype> clone() const override {return std::make_shared<ConcretePrototype>(*this);  // 浅拷贝}void print() const override {std::cout << "Prototype: " << name << std::endl;}
};int main() {std::shared_ptr<Prototype> prototype = std::make_shared<ConcretePrototype>("Original");std::shared_ptr<Prototype> clone = prototype->clone();  // 克隆对象prototype->print();clone->print();  // 输出与原型类似的对象return 0;
}

建造者模式示例(C++):

#include <iostream>
#include <string>// 产品类
class Product {
private:std::string partA;std::string partB;public:void setPartA(const std::string& part) { partA = part; }void setPartB(const std::string& part) { partB = part; }void show() const {std::cout << "Product with " << partA << " and " << partB << std::endl;}
};// Builder 接口
class Builder {
public:virtual ~Builder() {}virtual void buildPartA() = 0;virtual void buildPartB() = 0;virtual Product getResult() = 0;
};// 具体的 Builder 实现
class ConcreteBuilder : public Builder {
private:Product product;public:void buildPartA() override {product.setPartA("Part A");}void buildPartB() override {product.setPartB("Part B");}Product getResult() override {return product;}
};// Director 类,负责构建过程的控制
class Director {
private:Builder& builder;public:Director(Builder& builder) : builder(builder) {}void construct() {builder.buildPartA();builder.buildPartB();}
};int main() {ConcreteBuilder builder;Director director(builder);director.construct();Product product = builder.getResult();product.show();  // 输出构建后的产品return 0;
}

6. 总结对比

模式

原型模式

建造者模式

意图

通过复制现有对象来创建新对象。

通过分步骤构建复杂对象。

创建方式

克隆(浅拷贝或深拷贝)现有对象。

按步骤逐步构建对象。

结构

结构较简单,通常只有一个类实现克隆。

结构较复杂,通常涉及多个类和多个步骤。

状态修改

通过克隆对象后修改少量状态。

通过多个步骤灵活调整对象的各个部分。

应用场景

当对象创建昂贵且需要复制现有对象时。

当对象构建过程复杂,需要逐步构建或有多种构建方式时。

解释:

  • 原型模式:
    • Prototype 是一个抽象类,定义了 clone() 方法。
    • ConcretePrototype 是具体的实现类,负责实现 clone() 方法并执行对象的复制操作。

  • 建造者模式:
    • Builder 是一个接口,定义了构建产品的方法。
    • ConcreteBuilder 实现了 Builder 接口,具体构建 Product 的各个部分。
    • Director 负责控制构建过程,使用 Builder 来构建最终产品。
    • Product 是最终生成的产品类,包含构建的各个部分。

        两者的主要区别在于创建对象的方式和灵活性,原型模式专注于现有对象的复制,而建造者模式专注于通过步骤构建复杂对象。

相关文章:

原型模式和建造模式的区别

原型模式&#xff08;Prototype Pattern&#xff09;和建造者模式&#xff08;Builder Pattern&#xff09;虽然都是创建型设计模式&#xff0c;但它们的应用场景和实现方式有着显著的区别。以下是二者的详细对比&#xff1a; 1. 意图和应用场景 原型模式&#xff1a; 意图&a…...

最新 client-java 调用 k8s ApiServer

创建权限绑定 sa-role.yaml apiVersion: v1 kind: ServiceAccount metadata:name: my-admin #账号名namespace: kube-system--- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata:annotations:rbac.authorization.kubernetes.io/autoupdate: "true…...

TCP单包数据大于1460字节会被拆包的问题

关于TCP单包数据大于1460字节会被拆包的问题 1、问题背景&#xff1a; 最近在用STM32W5500做项目&#xff0c;需要STM32通过TCP协议发送数据到上位机并显示。当数据量小的时候上位机显示正常&#xff0c;一旦数据量大过大上位机就会出现数据丢失的情况&#xff0c;甚至数据直接…...

苏宁关键字搜索接口技术解析与实战

在当今的电商领域&#xff0c;搜索功能无疑是用户寻找心仪商品的最重要途径之一。苏宁作为国内知名的电商平台&#xff0c;其提供的API接口服务为开发者提供了丰富的商品数据。本文将详细介绍如何使用苏宁的关键字搜索接口&#xff0c;通过编写代码实现商品搜索功能。 接口概述…...

Java学习教程,从入门到精通,Java 基本数据类型详解(5)

Java 基本数据类型详解 Java是一种强类型语言&#xff0c;这意味着在Java程序中&#xff0c;每个变量都必须明确声明其数据类型。Java提供了八种基本数据类型&#xff08;Primitive Data Types&#xff09;&#xff0c;这些类型都是预先定义好的&#xff0c;并且每种类型都占用…...

使用Flask实现本机的模型部署

前言 模型部署是指将大模型运行在专属的计算资源上&#xff0c;使模型在独立的运行环境中高效、可靠地运行&#xff0c;并为业务应用提供推理服务。其目标是将机器学习模型应用于实际业务中&#xff0c;使最终用户或系统能够利用模型的输出&#xff0c;从而发挥其作用。 一、设…...

基于SSM的校园跑腿网站的设计与实现

文未可获取一份本项目的java源码和数据库参考。 课题来源及研究的目的和意义 随着网络技术的不断完善与发展&#xff0c;各种互联网公司不断如雨后春笋般不断涌现&#xff0c;丰富了人们生活的各个方面。近年来由于 Online To 0ffline即线上到线下(020)模式的发展和兴起&…...

【Java】正则表达式详解

目录 引言 一、基本概念 1.1 元字符 1.2 预定义字符类 1.3 边界匹配符 1.4 数量标识符 1.5 捕获与非捕获分组 二、Java中的正则表达式支持 三、正则表达式的使用示例 3.1 匹配字符串 3.2 替换字符串 3.3 分割字符串 3.4 使用Pattern和Matcher 3.5 捕获组和后向…...

Java知识巩固(七)

目录 面向对象 面向对象三大特征 封装 继承 多态 多态 深拷贝和浅拷贝区别了解吗?什么是引用拷贝? 浅拷贝 深拷贝 面向对象 万物皆为对象&#xff0c;也就是描述某个事物解决问题的过程中所发生的事情。 面向对象三大特征 封装 封装是指把一个对象的状态信息&…...

Ubuntu22.04 更换源

Ubuntu22.04 更换网易163源 1、编辑/etc/apt/sources.list文件 1 sudo nano /etc/apt/sources.list 2、清空文件内容&#xff0c;拷贝下列163源到文本。 1 2 3 4 5 6 7 8 deb http://mirrors.163.com/ubuntu/ jammy main restricted universe multiverse deb http://mirro…...

江恩理论和波浪理论的结合

结合波浪理论和江恩理论需要综合考虑市场波动的形态以及时间和价格的关系。这两者都是技术分析中的重要工具&#xff0c;能够帮助投资者更好地理解市场的趋势和未来的走势。 波浪理论&#xff08;Elliott Wave Theory&#xff09; 波浪理论是由Ralph Nelson Elliott提出的&…...

AJAX——AJAX 取消请求

利用 abort&#xff08;&#xff09;方法取消请求 本文分享到此结束&#xff0c;欢迎大家评论区相互讨论学习&#xff0c;下一篇继续分享AJAX中请求重复发送问题的学习。...

ruoyi域名跳转缓存冲突问题(解决办法修改:session名修改session的JSESSIONID名称)

【版权所有&#xff0c;文章允许转载&#xff0c;但须以链接方式注明源地址&#xff0c;否则追究法律责任】【创作不易&#xff0c;点个赞就是对我最大的支持】 前言 仅作为学习笔记&#xff0c;供大家参考 总结的不错的话&#xff0c;记得点赞收藏关注哦&#xff01; 目录 前…...

嵌入式QT中基本工程模板分析

大家好,今天主要来分享一下,如何分析一下QT的工程代码文件。 第一:QT工程分析...

Linux网络:UDP socket - 简单聊天室

Linux网络&#xff1a;UDP socket - 简单聊天室 聊天通信架构ServerInetAddrUdpServerMessageRoutermain Client测试 聊天通信架构 本博客基于Linux实现一个简单的聊天通信服务&#xff0c;以熟悉Linux的网络接口。 总代码地址&#xff1a;[UDPsocket-简单聊天通信] 文件结构…...

Codeforces Round 646 (Div. 2) E. Tree Shuffling(树,贪心)

题目链接 Codeforces Round 646 (Div. 2) E. Tree Shuffling 思路 考虑一个节点 u u u&#xff0c;显然它子树中的操作可以由它本身和祖先来进行。如果它的祖先有比它花费更小的&#xff0c;直接跳过节点 u u u。 我们分别记录每一个子树中位置不对的 0 0 0和 1 1 1的个数&…...

HCIE-Datacom题库_11_IPsecVPN【17道题】

一、单选题 1.IPsecSA(SecurityAssociation&#xff0c;安全联盟)有两种生成方式&#xff0c;分别是手工方式和IKE自动协商方式&#xff0c;以下关于这两种方式的描述中&#xff0c;错误的是哪一项? 手工方式和IKE方式建立的SA都支持动态刷新 IKE方式建立的SA,其生存周期由…...

Dongle Sentinal在Jenkins下访问不了的问题

背景&#xff1a; 工作站部署的jenkins的脚本无法正常打包&#xff0c;定位后发现是本地获取不了license&#xff0c;但是使用usb over network的远程license都能获取并正常打包 分析&#xff1a; 获取不了license的原因是本地无法识别dongle。根据提供信息&#xff0c;之前…...

X射线衍射(X-ray Diffraction,XRD)小白版

文章目录 实验过程原理晶体构成X射线波长diffraction 干涉效应 Braggs Law晶体间距d散射角度θ半波长λ/2公式 公式名称由来应用设备 实验过程 In the X-ray experiment , a sample is placed into the center of an instrument and illuminated with a beam of X-rays. 在X射…...

Nordic 定时器系统app timer[获取时间戳]

获取时间戳 想要在Nordic 定时器系统中获取时间戳,也就是是在调用app_timer的时候时间戳要有效,我们可以看看定时器系统初始化: ret_code_t app_timer_init(void) {ret_code_t err_code;drv_rtc_config_t config {.prescaler APP_TIMER_CONFIG_RTC_FREQUENCY,.int…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...