[C++][设计模式][原型模式]详细讲解

embedded/2024/9/23 13:47:40/

1.动机

  • 在软件系统中,经常面临这“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口
  • 如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得依赖这些”易变对象“的客户程序不随着需求改变而改变

2.模式定义

  • 定义:使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象
  • 结构
    请添加图片描述

3.要点总结

  • Prototype模式同样用于隔离对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有稳定的接口
  • Prototype模式对于**“如何创建易变类的实体对象“采用”原型克隆“的方法来做**, 它使得我们可以非常灵活地动态创建”拥有某些稳定接口“的新对象 —— 所需工作仅仅是注册一个新类的对象(即原型), 然后在任何需要的地方Clone
  • Prototype模式中的Clone方法可以利用某些框架中的序列化来实现深拷贝
  • 优点
    • 可以克隆对象,而无需与他们所属的具体类相耦合
    • 可以克隆预生成原型,避免反复运行初始化代码
    • 可以更方便地生成复杂对象
    • 可以用继承以外的方式来处理复杂对象的不同配置
  • 缺点
    • 需要为每一个类都配置一个clone方法
    • clone方法位于类的内部,当对已有类进行改造时,需要修改代码,违背了开闭原则
    • 当进行深拷贝的时候,需要编写较为复杂的代码,而且当对象之间存在多重嵌套时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现复杂
  • 适用场景
    • 对象之间相同或相似,及只是个别的几个属性不同时
    • 创建对象成本较大,例如初始化时间长,占用CPU太多,或者占用网络资源太多,需要优化资源
    • 创建一个对象需要频繁的数据准备或访问权限等,需要提高性能或者提高安全性
    • 系统中大量使用该类对象,且各个调用者都需要给它的属性重新赋值

4.代码感受

1.Prototype.cpp

// 抽象类
class ISplitter
{
public:virtual void split() = 0;virtual ISplitter* clone() = 0; // 通过克隆自己来创建对象virtual ~ISplitter(){}
};

2.ConcretePrototype.cpp

// 具体类
class BinarySplitter : public ISplitter
{
public:virtual ISplitter* clone(){return new BinarySplitter(*this); // 调用拷贝构造}
};class TxtSplitter: public ISplitter
{
public:virtual ISplitter* clone(){return new TxtSplitter(*this); // 调用拷贝构造}
};class PictureSplitter: public ISplitter
{
public:virtual ISplitter* clone(){return new PictureSplitter(*this); // 调用拷贝构造}
};class VideoSplitter: public ISplitter
{
public:virtual ISplitter* clone(){return new VideoSplitter(*this); // 调用拷贝构造}
};

3.Client.cpp

class MainForm : public Form
{ISplitter*  prototype; // 原型对象
public:MainForm(ISplitter* prototype){this->prototype = prototype;}void Button1_Click(){ISplitter* splitter=prototype->clone(); // 克隆原型splitter->split();}
};

http://www.ppmy.cn/embedded/53827.html

相关文章

尚硅谷vue2的todolist案例解析,基本概括了vue2所有知识点,结尾有具体代码,复制粘贴学习即可

脚手架搭建 1-初始化脚手架(全局安装) npm install -g vue/cli2-切换到创建项目的空目录下 vue create xxxx整体结构 整体思路 App定义所有回调方法 增删改查 还有统一存放最终数据,所有子组件不拿数据,由App下发数据&#xf…

Modbus TCP什么场景用?

什么是Modbus TCP Modbus TCP是一种基于TCP/IP网络的通信协议,它允许不同的设备通过以太网进行数据交换。Modbus协议最初是为串行通信设计的,但随着网络技术的发展,Modbus TCP应运而生,它继承了Modbus RTU和Modbus ASCII的许多优点…

网页元素定位秘籍:从HTML探秘到Python自动化实战20240626

网页元素定位秘籍:从HTML探秘到Python自动化实战 引言: 在数字化时代,网页成为了我们获取信息、交流和娱乐的重要窗口。当我们浏览网页时,很少会去思考这背后复杂的编程和定位技术。然而,对于开发者、测试工程师或自…

搞定求职难题:工作岗位列表+简历制作工具 | 开源专题 No.75

SimplifyJobs/New-Grad-Positions Stars: 8.5k License: NOASSERTION 这个项目是一个用于分享和跟踪美国、加拿大或远程职位的软件工作机会列表。该项目的核心优势和关键特点如下: 自动更新新岗位信息便捷地提交问题进行贡献提供一键申请选项 BartoszJarocki/cv…

河南资信乙级预评价:人员需缴唯一社保吗?

河南资信乙级预评价中,人员确实需要缴纳唯一社保。以下是详细的解读和归纳: 一、社保唯一性的定义 社保唯一性指的是参与河南资信乙级预评价的咨询工程师(投资)必须在申请单位有唯一且连续的社保缴纳记录。这一要求旨在确保咨询…

2024年水利工程与交通运输国际学术会议(ICWCET 2024)

全称:2024年水利工程与交通运输国际学术会议(ICWCET 2024) 会议网址: http://www.icwcet.com 会议时间: 2024/6/25 截稿时间:2024/6/15 会议地点: 天津 投稿邮箱:icwcetsub-conf.com 投稿标题:ICWCET 2024ArticleTEL。 ★会议简介…

kafka 组件架构师需要掌握哪些核心知识点

kafka 组件架构师需要掌握哪些核心知识点? 作为架构师,关于 Kafka 组件需要掌握以下关键知识点,以确保能够设计、部署和维护一个高效、可靠的 Kafka 系统。 这些知识点涵盖了 Kafka 的核心概念、架构、配置、性能优化、安全性、监控和运维等方面。 1. Kafka 核心概念 Topi…

nn.Embedding 根据索引生成的向量有权重吗

import torch import torch.nn as nn 假设有一个大小为 10x3 的 Embedding 层,其中有 10 个单词,每个单词用一个长度为 3 的向量表示 num_words 10 embedding_dim 3 创建 Embedding 层 embedding_layer nn.Embedding(num_words, embedding_dim) p…