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

        原型模式(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 是最终生成的产品类,包含构建的各个部分。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【论文阅读】2022 TChecker Precise Static Inter-Procedural Analysis for Detecting

总览 “TChecker: Precise Static Inter - Procedural Analysis for Detecting Taint - Style Vulnerabilities in PHP Applications” 由香港中文大学的 Changhua Luo、Penghui Li 和 Wei Meng 撰写。论文介绍了 TChecker 工具&#xff0c;用于检测 PHP 应用中的污点式漏洞&am…

【Linux】为什么环境变量具有全局性?共享?写时拷贝优化?

环境变量表具有全局性的原因&#xff1a; 环境变量表之所以具有全局性的特征&#xff0c;主要是因为它们是在进程上下文中维护的&#xff0c;并且在大多数操作系统中&#xff0c;当一个进程创建另一个进程&#xff08;即父进程创建子进程&#xff09;时&#xff0c;子进程会继承…

动态路由:RIP实验

1.划分IP 2.配置环回 3.接口配置IP地址 4.进入RIP中&#xff0c;关闭手工汇总&#xff0c;选择版本号&#xff0c;宣告 5.ping命令查看是否全网通 6.在R3上配置缺省路由 [R3-rip-1]default-route originate 在边界路由器上下发缺省 7.为了安全配置手工认证 [R1-Gigab…

qt QVariant详解

QVariant是Qt框架中一个功能强大的变体类&#xff0c;它提供了一种通用的方式来存储Qt对象及其他类的值&#xff0c;能够以类似于指针的方式存储任意类型的值。 一、 主要特性 通用性&#xff1a;QVariant可以存储几乎所有数据类型&#xff0c;包括基本数据类型&#xff08;如…

刷题小记9:回溯

回溯算法模板&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点;backtracking(路径&#xff0c;选择列表); // 递归回溯&#xff0c;撤销处理…

html+vue实现动态复杂table

1、效果 2、代码 <div style"overflow: scroll; width: 100%;height: calc(100% - 80px);"><table class"table table-bordered" style"width: auto;table-layout: fixed;"><thead style"position: sticky;top: -1px;z-inde…

【C++干货篇】——类和对象的魅力(四)

【C干货篇】——类和对象的魅力&#xff08;四&#xff09; 1.取地址运算符的重载 1.1const 成员函数 将const修饰的成员函数称之为const成员函数&#xff0c;const修饰成员函数放到成员函数参数列表的后面。const实际修饰该成员函数隐含的this指针&#xff08;this指向的对…

IDEA如何查看所有的断点(Breakpoints)并关闭

前言 我们在使用IDEA开发Java应用时&#xff0c;基本上都需要进行打断点的操作&#xff0c;这方便我们排查BUG&#xff0c;也方便我们查看设计的是否正确。 不过有时候&#xff0c;我们不希望进入断点&#xff0c;这时候除了点击断点关闭外&#xff0c;有没有更快速的方便关闭…

深入浅出剖析重量级文生图模型Flux.1

24年8月&#xff0c;Flux.1的发布又一次火爆整个AI绘图领域&#xff0c; 号称AI文生图的“新标杆”&#xff0c;刷新AI图像领域的新格局。 Flux是一款由Black Forest Labs开发的尖端AI图像生成工具&#xff0c;旨在通过先进的技术将文本提示转化为高质量的图像。Flux AI支持多…

利用 OBS 推送 WEBRTC 流到 smart rtmpd

webrtc whip 推流 & whep 拉流简介 RFC 定义 通用的 webrtc 对于 SDP 协议的交换已经有对应的 RFC 草案出炉了。这就是 WHIP( push stream ) & WHEP ( pull stream ) . WHIP RFC Link: https://www.ietf.org/archive/id/draft-ietf-wish-whip-01.html WHEP RFC Link:…

总分441数一149专137东南大学820信号数电考研经验电子信息与通信工程电路原920专业基础综合,真题,大纲,参考书。

一. 写在前面的话 本人是23年考生&#xff0c;本科就读于西电电子信息工程&#xff0c;以441分总分&#xff08;数学一149&#xff0c;英语83&#xff0c;专业课820&#xff08;原920信号和数电专业基础综合&#xff09;137&#xff0c;政治73&#xff09;考上东南信院电路与系…

虚拟机(VMwara Workstation17)保姆级别的安装(附软件获取途径)

文章目录 一、虚拟机的作用二、虚拟机的获取三、虚拟机的安装步骤四、总结 一、虚拟机的作用 压根不需要给自己的电脑重装系统&#xff0c;就可以使用Linux系统。简单来说就是虚拟出一个计算机&#xff0c;安装Linux系统&#xff0c;便于学习和工作 关于虚拟机的介绍&#xf…

初识Linux · 预备文件系统

目录 前言&#xff1a; 看看物理磁盘 了解磁盘的存储结构 对磁盘进行逻辑抽象 前言&#xff1a; 我们在上文探讨的问题都是基于文件是被打开的情况&#xff0c;那么对于文件没有被打开的情况&#xff0c;我们是没有探讨过的&#xff0c;而本文作为文件系统的预备知识&…

多ip访问多网站

1.前提配置 关防火墙 关selinux 2.安装web服务程序nginx 3.当前主机添加多地址&#xff08;ip a&#xff09; 4.自定义nginx配置文件通过多地址区分多网站 /etc/nginx/conf.d/test_ip.conf server { #标记为一个虚拟主机} 5.根据配置在主机创建数据文件 6.重启服务加载配…

【ROS2】构建导航工程

1、ROS小车组成 ROS小车由三大件组成:运动底盘、ROS主控、导航传感器。 1.1 运动底盘 运动底盘的硬件由车轮、电机(带编码器)、电机驱动器、STM32控制器、电池等组成。 涉及的知识点主要为:STM32单片机程序、机器人运动学分析 1)STM32单片机程序 单片机程序框架如下:…

Modbus TCP报错:Response length is only 0 bytes

问题描述&#xff1a; 使用modbus_tk库&#xff0c;通过Modbus tcp连接PLC时&#xff0c;python中的一个报错信息&#xff1a; Response length is only 0 bytes报错原因&#xff1a; 与Modbus TCP 服务端建立连接后没有断开&#xff0c;继续作为长连接使用&#xff0c;客户端…

vue3 + ts + element-plus 二次封装 el-dialog

实现效果&#xff1a; 组件代码&#xff1a;注意 style 不能为 scoped <template><el-dialog class"my-dialog" v-model"isVisible" :show-close"false" :close-on-click-modal"false" :modal"false"modal-class&…

Java调用大模型 - Spring AI 初体验

Spring AI&#xff1a;为Java开发者提供高效的大模型应用框架 当前Java调用大模型时面临缺乏高效AI应用框架的问题。Spring作为资深的Java应用框架提供商&#xff0c;通过推出Spring AI来解决这一挑战。它借鉴了LangChain的核心理念&#xff0c;并结合了Java面向对象编程的优势…

提升网络安全防御有效性,服务器DDoS防御软件解读

从购物、银行业务、旅行计划到娱乐&#xff0c;人们越来越多地转向数字领域来促进他们的公共和私人生活。然而&#xff0c;当DDoS攻击汹涌而至&#xff0c;企业很可能会陷入数小时或数天的混乱局面&#xff0c;用户的体验也会大打折扣。根据DDoS-Guard发布的数据&#xff0c;20…

QML 基本动画

在介绍完 QML 动画框架之后,现在我们来看看具体的动画及其用法。先从最常用的基本动画入手,这些动画包括:PropertyAnimation、ColorAnimation、Vector3dAnimation 和 PathAnimation 等,它们不仅能够帮助我们轻松地为应用程序添加动态效果,还能显著提升用户体验,使得界面更…