带你深入浅出设计模式:四、原型模式:编程中的克隆技术

news2024/11/26 5:55:43

此为设计模式谈!

总-分-总的结构生活化的例子给你讲解设计模式!

码农不易,各位学者学到东西请点赞收藏支持支持!

开始部分:

总:原型模式的核心逻辑在于通过克隆现有实例来创建新对象,而不是通过传统的构造函数,根据需求来修改属性

分:

1.老规矩,打开VS创建一个控制台应用

2.实现编码,这里用制作三明治为讲解例子

2.1 创建抽象原型基类

2.2 实现原型类的克隆逻辑

2.3 创建原型实例

2.4 克隆对象

2.5 使用克隆对象

#include <iostream>
#include <map>
#include <string>
#include <vector>

//1.创建抽象基类
class Sandwich {
public:
    Sandwich(std::string bread, std::string sauce, std::vector<std::string> toppings)
        : _bread(bread), _sauce(sauce), _toppings(toppings) {}

    virtual Sandwich* clone() const = 0;//clone纯虚函数,用于克隆对象
    virtual void display() const = 0;//用于展示三明治属性

protected:
    std::string _bread;//面包类型
    std::string _sauce;//酱汁类型
    std::vector<std::string> _toppings;//配料
};

//经典火腿三明治类
class HamSandwich : public Sandwich {
public:
    HamSandwich(std::string bread, std::string sauce, std::vector<std::string> toppings)
        : Sandwich(bread, sauce, toppings) {}//子类调用基类构造函数

    Sandwich* clone() const override {//重写clone方法,常量成员函数,不会修改调用该函数的对象的任何成员变量
        return new HamSandwich(*this);
    }

    void display() const override {
        std::cout << "Ham Sandwich - Bread: " << _bread
                  << ", Sauce: " << _sauce
                  << ", Toppings: ";
        for (const auto& topping : _toppings) {
            std::cout << topping << ' ';
        }
        std::cout << std::endl;
    }
};

//意式蔬菜三明治类
class VeggieSandwich : public Sandwich {
public:
    VeggieSandwich(std::string bread, std::string sauce, std::vector<std::string> toppings)
        : Sandwich(bread, sauce, toppings) {}

    Sandwich* clone() const override {
        return new VeggieSandwich(*this);
    }

    void display() const override {
        std::cout << "Veggie Sandwich - Bread: " << _bread
                  << ", Sauce: " << _sauce
                  << ", Toppings: ";
        for (const auto& topping : _toppings) {
            std::cout << topping << ' ';
        }
        std::cout << std::endl;
    }
};

int main() {
    // 建立“原型”三明治
    Sandwich* hamPrototype = new HamSandwich("White", "Mayo",
                                             {"Ham", "Lettuce", "Tomato"});
    Sandwich* veggiePrototype = new VeggieSandwich("Wheat", "Pesto",
                                                    {"Cucumber", "Avocado"});

    // 复制并个性化
    Sandwich* customerOrder1 = hamPrototype->clone(); // 点单经典火腿三明治
    customerOrder1->_sauce = "Mustard"; // 添加个人偏好
    customerOrder1->_toppings.push_back("Cheese");

    Sandwich* customerOrder2 = veggiePrototype->clone(); // 点单经典意式蔬菜三明治
    customerOrder2->_bread = "Sourdough"; // 更改面包
    customerOrder2->_toppings.push_back("Olives");

    // 展示订单
    customerOrder1->display();
    customerOrder2->display();

    // 清理
    delete hamPrototype;
    delete veggiePrototype;
    delete customerOrder1;
    delete customerOrder2;

    return 0;
}

总:主要解决:在运行期间建立和删除原型。优点:性能提高、避免构造函数的约束当对象的构造函数是私有的或受到保护时,直接使用构造函数创建对象可能是不可行的)。

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

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

相关文章

(12)MATLAB莱斯(Rician)衰落信道仿真2补充:莱斯衰落信道与莱斯随机变量

文章目录 前言1.关于莱斯衰落信道仿真的两个公式2.由式&#xff08;1&#xff09;推出式&#xff08;2&#xff09; 前言 本文给出关于莱斯衰落信道仿真的两个公式之间的推导。 1.关于莱斯衰落信道仿真的两个公式 在上一篇《&#xff08;11&#xff09;MATLAB莱斯&#xff08…

不只是前端,后端、产品和测试也需要了解的浏览器知识(一)

目录标题 一、我们为什么要了解浏览器&#xff1f;1. 对于前端开发者2. 对于后端开发者 二、浏览器发展概述1. 宏观发展2. 微观发展 三、浏览器核心部件1. 浏览器界面介绍2. 目前浏览器的使用的渲染引擎和解释器总结3. 浏览器的解释器 四、各家浏览器目前的市场占比五、整体总结…

深度学习笔记18_TensorFlow实现猫狗识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境&#xff1a;Python 3.9 2.编译器&#xff1a;Pycharm 3.深度学习环境&#xff1a;TensorFlow 2.10.0 二、GPU设置…

wpf加载带材料的3D模型(下载的3D预览一样有纹理)

背景&#xff1a;最近真的是忙啊&#xff0c;累出汁水了 整体效果&#xff1a; 放大可以看清砖头&#xff1a; 1、需要自己准备好3D模型&#xff0c;比如我这里是下载的这里的3D Warehouse&#xff0c;下载Collada File格式文件 2、解压可以看到一个model.dae和材料的文件夹&…

SAP HCM 抓取模拟工资核算日志RT表数据

一&#xff1a;故事背景 SAP的核算其实比较麻烦的就是没地方可以导出核算成功的人员编号&#xff0c;即使能导出也是树形的结构&#xff0c;需要反复加工多次才能整理好员工&#xff0c;所以非常麻烦&#xff0c;今天就想能不能抓取模拟工资的rt表数据. 二&#xff1a;解决办法…

【项目记录】llama-7B基于llama.cpp在Qemu-riscv64向量扩展指令下的部署

概述 参考博客链接&#xff1a; Accelerating llama.cpp with RISC-V Vector Extension 基于RVV的llama.cpp在Qemu上的演示 Github相关链接&#xff1a; Llama.cpp中利用GGML中对RVV的支持1 Llama.cpp中利用GGML中对RVV的支持2 llama.cpp工程 2024/10/02: 工具准备OK&#…

Log4j的配置与使用详解

Log4j的配置与使用详解 Log4j介绍 Log4j是Apache的一个开源项目&#xff0c;通过使用Log4j&#xff0c;我们可以控制日志信息输送的目的地是控制台、文件、GUI组件&#xff0c;我们可以控制每条日志的输出格式&#xff1b;只需要通过一个配置文件就可以灵活的配置&#xff0c…

Android SystemUI组件(11)SystemUIVisibility解读

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节思维导图&#xff0c;主要关注左侧最上方SystemUiVisibility解读部分即可。 本章节主要讲解SystemUiVisibility的概念及其相…

【EXCEL数据处理】000015案例 EXCEL公式与基础函数

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000015案例 EXCEL公式与基础函数。使用的软件&#x…

基础岛第3关:浦语提示词工程实践

模型部署 使用下面脚本测试模型 from huggingface_hub import login, snapshot_download import osos.environ[HF_ENDPOINT] https://hf-mirror.comlogin(token“your_access_token")models ["internlm/internlm2-chat-1_8b"]for model in models:try:snapsh…

Java--IO基本流

IO流 概述 生活中&#xff0c;你肯定经历过这样的场景。当你编辑一个文本文件&#xff0c;忘记了ctrls &#xff0c;可能文件就白白编辑了。当你电脑上插入一个U盘&#xff0c;可以把一个视频&#xff0c;拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢&#xff1f;键盘…

昇思MindSpore进阶教程--二阶优化器THOR

大家好&#xff0c;我是刘明&#xff0c;明志科技创始人&#xff0c;华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享&#xff0c;如果你也喜欢我的文章&#xff0c;就点个关注吧 正文介绍 深度学习训练过程可以看成损失…

Neo4j CQL语句 使用教程

CREATE命令 : CREATE (<node-name>:<label-name>{ <Property1-name>:<Property1-Value>........<Propertyn-name>:<Propertyn-Value>} )字段说明 CREATE (dept:Dept { deptno:10,dname:“Accounting”,location:“Hyderabad” })&#…

ATLAS/ICESat-2 L3B 每 3 个月网格动态海洋地形图 V001

目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATLAS/ICESat-2 L3B Monthly 3-Month Gridded Dynamic Ocean Topography V001 ATLAS/ICESat-2 L3B 每月 3 个月网格动态海洋地形图 V001 简介 该数据集包含中纬度、北极和南极网格上动态海洋地形&…

[Offsec Lab] ICMP Monitorr-RCE+hping3权限提升

信息收集 IP AddressOpening Ports192.168.52.218TCP:22,80 $ nmap -p- 192.168.52.218 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.9p1 Debian 10deb10u2 (protocol 2.0) | ssh-hostkey: | 2048 de:b5:23:89:bb:9f:d4:1…

Kubernetes-Kind篇-01-kind搭建测试集群

1、Kind 介绍 官方文档地址&#xff1a;https://kind.sigs.k8s.io/ github仓库地址&#xff1a;https://github.com/kubernetes-sigs/kind 国内镜像仓库地址&#xff1a;https://gitcode.com/gh_mirrors/ki/kind/overview kind 是一种使用 Docker 容器 nodes 运行本地 Kubern…

算法日记-链表翻转

文章目录 场景&#xff1a;解法一&#xff1a;迭代步骤完整代码 解法二&#xff1a;递归步骤完整代码 重温力扣常规算法&#xff0c;记录算法的演变&#xff0c;今天介绍的是链表翻转 场景&#xff1a; 现在有一条单项链表&#xff0c;链表节点存在一个数据和指向下一个节点的…

MySQL--三大范式(超详解)

目录 一、前言二、三大范式2.1概念2.2第一范式&#xff08;1NF&#xff09;2.3第二范式&#xff08;2NF&#xff09;2.3第三范式&#xff08;3NF&#xff09; 一、前言 欢迎大家来到权权的博客~欢迎大家对我的博客进行指导&#xff0c;有什么不对的地方&#xff0c;我会及时改进…

AI不可尽信

看到某项目有类似这样的一段代码 leaves : make([]int, 10) leaves leaves[:0]没理解这样的连续两行,有何作用? 初始化一个长度和容量都为10的切片,接着把切片长度设置为0 即如下demo: (在线地址) package mainimport "fmt"func main() {leaves : make([]int, 1…

【2023工业3D异常检测文献】CPMF: 基于手工制作PCD描述符和深度学习IAD结合的AD方法

Complementary Pseudo Multimodal Feature for Point Cloud Anomaly Detection 1、Background 早期的点云异常检测(PCD)表示是手工制作的&#xff0c;依赖于启发式设计。随着深度学习的发展&#xff0c;最近的方法采用了基于学习的PCD特征。尽管与基线相比有相当大的改进&…