【C++设计模式之亨元模式:结构型】分析及示例

news2024/12/23 13:13:47

简介

享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过共享对象,有效地支持大量细粒度的对象,从而减少内存和性能消耗。它通过将对象分为可共享的内部状态和不可共享的外部状态,从而实现对象共享。

描述

享元模式通过共享对象来减少对象创建和消耗的开销,尤其适用于有大量相似对象的场景。在享元模式中,每个对象被视为两个部分:内部状态和外部状态。内部状态是可以共享的,而外部状态则根据具体的场景而变化。

原理

享元模式的关键是共享对象。当客户端需要创建一个对象时,首先检查对象池中是否已经存在相同的对象,如果存在则返回该对象,如果不存在则创建一个新对象并将其添加到对象池中。通过共享对象,可以减少内存消耗和对象创建的开销。

类图

在这里插入图片描述

示例

假设要创建一个游戏中的棋局对象,棋局中有很多棋子,每个棋子有自己的位置和颜色。
为了节省内存和创建开销,可以使用享元模式来共享相同颜色的棋子对象。

在下面的示例中,定义了一个棋子接口 ChessPiece 和一个具体的实现类 ChessPieceImpl,用于表示棋子的内部状态。此外还定义了一个棋子工厂类 ChessPieceFactory,用于创建和管理棋子对象。

#include <>
#include <vector>
#include <unordered_map>

// 棋子接口
class ChessPiece {
public:
    virtual void draw(int x, int y) = 0;
};

// 具体的棋子实现类
class ChessPiece : public ChessPiece {
private:
    std::string color;

public:
    ChessPieceImpl(std::string color) : color(color) {}

    void draw(int x, int y) {
        std::cout << "Draw a " << color << " chess piece at (" << x << ", " << y << ")" << std::endl;
    }
};

// 棋子工厂类
class ChessPieceFactory {
private:
    map<std::string, ChessPieceImpl*> chessPieces;

public:
    ChessPiece* getChessPiece(std::string color) {
        if (chessPieces.find(color) == chessPieces.end()) {
            chessPieces[color] = new ChessPieceImpl(color);
        }
        return chessPieces[color];
    }
};

int main() {
    ChessPieceFactory factory;

    // 绘制黑色棋子
    ChessPiece* blackPiece1 = factory.getChessPiece("black");
    blackPiece1->draw(0, 0);

    // 绘制黑色棋子
    ChessPiece* blackPiece2 = factory.getChessPiece("black");
    blackPiece2->draw(0, 1);

    // 绘制白色棋子
    ChessPiece* whitePiece = factory.getChessPiece("white");
    whitePiece->draw(1, 1);

    // 释放资源
    delete blackPiece1;
    delete blackPiece2;
    delete whitePiece;

    return 0;
}

输出结果

Draw a black chess piece at (0, 0)
Draw a black chess piece at (0, 1)
Draw a white chess piece at (1, 1)

解释

在上述示例中,使用了享元模式来共享相同颜色的棋子对象。
首先,创建了一个棋子工厂对象 ChessPieceFactory,用于创建和管理棋子对象。
当客户端需要创建棋子时,首先检查工厂中是否已经存在相颜色的棋子对象,如果存在则返回该对象,不存在则创建一个新的棋子对象并将其到工厂中。

在输出结果中,可以看到,虽然创建了两个黑色的棋子对象,但实际上它们是同一个对象,因为它们共享了相同的内部状态(颜色)。而白色的棋子对象则是一个新创建的对象。

结论

享元模式可以有效地减少内存和对象创建的开销,特别适用于有大量相似对象的场景。通过将对象分为可共享的内部状态和不可共享的外部状态,可以实现对象的共享,提高系统性能。

应用场景

享元模式适用于以下情况:

  1. 系统中存在大量相似的对象,造成了内存和性能上的浪费。
  2. 对象的大部分状态可以转化为外部状态。
  3. 应用不依赖对象标识。

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

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

相关文章

AMEYA360分析:纳芯微推出超低功耗TMR开关/锁存器 NSM105x系列

纳芯微推出基于隧道磁阻 (TMR) 的超低功耗磁开关/锁存器NSM105x系列&#xff0c;为数字位置检测提供高精度的解决方案&#xff0c;可被广泛应用于工业与消费领域的位置检测。 NSM105x产品系列包含了3个产品型号&#xff0c;即NSM1051(单极开关)、NSM1052(全极开关)、NSM1053(锁…

四种常见软件架构简介

文章目录 一、单体架构二、分布式应用三、微服务架构四、Serverless架构五、总结 如果一个软件开发人员&#xff0c;不了解软件架构的演进&#xff0c;会制约技术的选型和开发人员的生存、晋升空间。这里我列举了目前主要的四种软件架构以及他们的优缺点&#xff0c;希望能够帮…

uniapp 显示icon异常

按照文档创建的uni-ui项目&#xff0c;仿照示例程序写的代码中icon显示异常 &#xe470; 异常情况&#xff1a; 正常情况&#xff1a; 通过比对代码发现&#xff0c;示例程序的App.vue中 有一个引用是问题的关键 正是因为多了这一个引用文件&#xff0c;图表的显示才能正常 …

在Linux怎么用vim实现把一个文件里面的文本复制到另一个文件里面

2023年10月9日&#xff0c;周一下午 我昨天遇到了这个问题&#xff0c;但在网上没找到图文并茂的博客&#xff0c;于是我自己摸索出解决办法后&#xff0c;决定写一篇图文并茂的博客。 情景 假设现在我要用vim把file_transfer.cpp的内容复制到file_transfer.hpp里面 第一步 …

网络安全(黑客)小白学习笔记

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防…

linux centos出现No space left on device解决方案

问题是因为系统磁盘空间不足 解决方法: 找到那个磁盘不足问题 df -lh 发现/dev/mapper/cl-root磁盘已用50G,有如下 解决方案&#xff1a; 1、如果是虚拟机可以通过分配空间使其空间增加 2、将其他不常用磁盘空间分配给cl-root如&#xff08; /dev/mapper/cl-home &#…

路径总和 III

题目链接 路径总和 III 题目描述 注意点 二叉树的节点个数的范围是 [0,1000]求该二叉树里节点值之和等于 targetSum 的 路径 的数目 解答思路 可根据前缀和的思路解决本题&#xff0c;前缀和表示从根节点开始&#xff0c;往左或往右组成的路径和&#xff0c;统计从根节点开…

windows下在cmd和git bash中执行bash download.sh失败

cmd报错信息&#xff1a; 解决办法&#xff1a; win64-wget-1.21.4 安装软件wget&#xff0c;如下这是64位的包&#xff0c;解压后&#xff0c;下面有个wget.exe&#xff0c;拷贝到C:\Windows\System32、 然后打开cmd&#xff0c;执行wget -V 如上&#xff0c;有版本信息就O…

Java变量的声明和初始化,Java变量的作用域:静态变量、全局变量和局部变量

java 语言是强类型&#xff08;Strongly Typed&#xff09;语言&#xff0c;强类型包含以下两方面的含义&#xff1a; 所有的变量必须先声明、后使用。指定类型的变量只能接受类型与之匹配的值。 这意味着每个变量和每个表达式都有一个在编译时就确定的类型。类型限制了一个变…

2.springcloudalibaba项目搭建(基于alibaba2021.0.5.0版本)

文章目录 [TOC](文章目录) 前言一、项目配置1.1 pom配置1.2 nacos新建命名空间1.3 项目配置1.4 nacos上配置配置文件1.5 代码新增测试读取服务配置代码1.6 启动类增加注解 二、启动服务并测试2.1 启动服务&#xff0c;查看是否注册成功2.2 测试是否读取到了nacos上的配置 总结 …

嵌入式系统中的加密性能:第2部分

本系列的第1部分讨论了影响系统级密码性能的硬件和软件变量。现在&#xff0c;在第2部分中&#xff0c;我们将重点介绍两种用于测量高级后备加速器性能的方法&#xff1a;1&#xff09;驱动器级加速器测试以识别加速器或SoC内存带宽约束&#xff0c;以及2&#xff09;应用程序/…

什么是电商 API接口 以及电子商务网站为何使用它们

从技术上讲&#xff0c;API是应用程序编程接口的首字母缩写&#xff0c;被认为是构建应用软件的一组协议。实际上&#xff0c;API 是让人们保持数字联系的大部分基础。 从我们手机上的应用程序到复杂的飞行控制系统&#xff0c;API 将原本完全不同的系统组合在一起以创建单一…

睿趣科技:抖音店铺怎么取名受欢迎

抖音作为国内最大的短视频平台&#xff0c;其商业价值不容忽视。许多商家和创作者都在抖音上开设了自己的店铺&#xff0c;而一个富有创意和吸引力的店铺名字&#xff0c;往往能带来更多的客流量。那么&#xff0c;如何为抖音店铺取个好名字呢?以下是一些有用的建议。 明确定位…

Linux配置SSH允许TCP转发

#编辑SSH配置文件 vi /etc/ssh/sshd_config #重启SSH服务 systemctl restart sshd.service AllowTcpForwarding yes

MES生产执行解决方案提供商,可定制工厂MES精益制造管理系统-亿发

亿发智能制造MES系统&#xff1a;驱动制造业创新&#xff0c;实现数字化生产和管理 MES管理系统以实时协同思想为核心&#xff0c;着重于精益生产计划的实施和车间实时调度。对生产现场和业务经营的数据进行全面的系统化管理&#xff0c;以数据分析的结果为基础&#xff0c;协助…

小程序搭建的技巧|网站建设|软件定制APP开发

小程序搭建的技巧|网站建设|软件定制APP开发 首先&#xff0c;我们要知道小程序是一个非常方便的工具&#xff0c;它可以让我们在手机上运行一些应用&#xff0c;不用下载安装&#xff0c;非常方便。小程序可以分为两种&#xff1a;一种是代码开发&#xff0c;另一种是模板开发…

抖音手机实景无人直播间怎么搭建?

手机无人直播已成为用户直播和商家直播带货的一项热门技术趋势&#xff0c;为消费者提供了全新的观看体验。无人直播&#xff0c;顾名思义&#xff0c;即通过无人直播软件或数字人来进行无人直播。这一技术的广泛应用&#xff0c;不仅为短视频渠道带来了更丰富的玩法&#xff0…

MySQL 主从同步(读写分离)

Spring Cloud 微服务系列文章&#xff0c;点击上方合集↑ 1. 开头 在生产环境中&#xff0c;为了应对大量的读写请求并减轻数据库的负载压力&#xff0c;常常会使用MySQL主从同步来实现读写分离的架构。通过这种架构&#xff0c;主数据库负责处理写操作&#xff0c;而从数据库…

知识增强语言模型提示 零样本知识图谱问答10.8

知识增强语言模型提示 零样本知识图谱问答 摘要介绍相关工作方法零样本QA的LM提示知识增强的LM提示与知识问题相关的知识检索 摘要 大型语言模型&#xff08;LLM&#xff09;能够执行 零样本closed-book问答任务 &#xff0c;依靠其在预训练期间存储在参数中的内部知识。然而&…