设计模式:享元模式(C++实现)

享元模式(Flyweight Pattern)是一种结构设计模式,它通过共享对象来有效地支持大量细粒度的对象。享元模式的目标是尽量减少内存使用,通过共享相同的数据来减少对象的数量。
以下是一个简单的C++享元模式的示例:

#include <iostream>
#include <unordered_map>// 抽象享元类
class Flyweight
{
public:virtual void operation() = 0;
};// 具体享元类
class ConcreteFlyweight : public Flyweight
{
private:std::string intrinsicState;public:ConcreteFlyweight(const std::string &intrinsicState) : intrinsicState(intrinsicState) {}void operation() override{std::cout << "Concrete Flyweight: " << intrinsicState << std::endl;}
};// 享元工厂类
class FlyweightFactory
{
private:std::unordered_map<std::string, Flyweight *> flyweights;public:Flyweight *getFlyweight(const std::string &intrinsicState){if (flyweights.find(intrinsicState) == flyweights.end()){flyweights[intrinsicState] = new ConcreteFlyweight(intrinsicState);}return flyweights[intrinsicState];}~FlyweightFactory(){for (auto it = flyweights.begin(); it != flyweights.end(); ++it){delete it->second;}flyweights.clear();}
};int main()
{FlyweightFactory flyweightFactory;Flyweight *flyweight1 = flyweightFactory.getFlyweight("state1");Flyweight *flyweight2 = flyweightFactory.getFlyweight("state2");Flyweight *flyweight3 = flyweightFactory.getFlyweight("state2");flyweight1->operation();flyweight2->operation();flyweight3->operation();return 0;
}

运行结果:

Concrete Flyweight: state1
Concrete Flyweight: state2
Concrete Flyweight: state2

在上述示例中,Flyweight是抽象享元类,定义了享元对象的接口。ConcreteFlyweight是具体享元类,实现了具体的享元对象。FlyweightFactory是享元工厂类,负责创建和管理享元对象。
在main()函数中,首先创建了一个享元工厂对象flyweightFactory。然后通过调用getFlyweight()方法来获取享元对象。如果工厂中不存在对应的享元对象,则创建一个新的享元对象并将其存储在工厂中;如果已存在对应的享元对象,则直接返回该对象。最后,通过调用享元对象的operation()方法来执行操作。
通过享元模式,可以减少对象的数量,节省内存空间。相同的数据可以被多个对象共享,从而降低了系统的开销。享元模式适用于需要创建大量相似对象的场景,可以提高系统的性能和效率。

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

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

相关文章

网络安全--防火墙旁挂部署方式和高可靠性技术

目录 一、防火墙 二、防火墙旁挂部署方式 使用策略路由实现 第一步、IP地址配置 第二步、配置路由 第三步、在防火墙上做策略 第四步、在R2上使用策略路由引流 三、防火墙高可靠性技术--HRP 拓扑图 第一步、配置SW1、SW2、FW1、FW2 第二步、进入防火墙Web页面进行配…

基于Python的微博舆论分析,微博情感分析可视化系统(V2.0)

简介 Python基于微博的舆情分析&#xff0c;情感分析可视化系统 微博舆情分析系统&#xff0c;项目后端分爬虫模块、数据分析模块、数据存储模块、业务逻辑模块组成。 功能包括 登陆注册用户管理热门事件展示舆情分析&#xff0c;包括舆情分析&#xff0c;情感分类&#xff0…

程序运行过程中消耗的是堆内存还是栈内存还是其他?

程序在运行过程中会使用多种类型的内存&#xff0c;其中最常见的是堆内存和栈内存。下面是对它们的简要描述&#xff0c;以及它们在程序中的用途&#xff1a; 栈内存 (Stack Memory)&#xff1a; 当函数调用发生时&#xff0c;栈用于存储局部变量、函数参数和返回地址。栈是后进…

2023最新PS(photoshop)Win+Mac免费下载安装包及教程内置AI绘画-网盘下载

2023最新PS(photoshop)WinMac免费下载安装包及教程内置AI绘画-网盘下载 2023最新PS(photoshop)免费下载安装教程来咯&#xff5e; 「PhotoShop」全套&#xff0c;winmac&#xff1a; https://pan.quark.cn/s/9d8d8ef5c400#/list/share 所有版本都有 1&#xff0c;复制链接…

400G QSFP-DD FR4 与 400G QSFP-DD FR8光模块:哪个更适合您的网络需求?

QSFP-DD 光模块随着光通信市场规模的不断增长已成为400G市场中客户需求量最高的产品。其中400G QSFP-DD FR4和400G QSFP-DD FR8光模块都是针对波分中距离传输&#xff08;2km&#xff09;的解决方案&#xff0c;它们之间有什么不同&#xff1f;应该如何选择应用&#xff1f;飞速…

安卓生成公钥和md5签名

安卓公钥和md5证书签名 大家好&#xff0c;最近需要备案app&#xff0c;用到了公钥和md5&#xff0c;MD5签名我倒是知道&#xff0c;然而对于公钥却一下子不知道了&#xff0c; 现在我讲一下我的流程。 首先是md5证书签名的查看&#xff0c; 生成了apk和签名.jks后&…

Oracle 12c Docker镜像配置SSL

一、Docker运行Oracle 12c服务 a.拉取镜像 docker pull truevoly/oracle-12cb.运行 docker run -d -p 1521:1521 -p 2484:2484 -v /data/oracle/:/opt/oracle --name oracle_12c truevoly/oracle-12cc.查看日志 docker logs -f oracle_12cd.出现如下信息&#xff0c;则启动…

makefile中常见函数应用例子

makefile中常见函数应用例子 1&#xff09;subst函数&#xff1a; subst函数用于字符串替换。以下是一个示例&#xff1a; $(subst ee,EE,feet on the street)2&#xff09;patsubst函数&#xff1a; patsubst函数用于模式字符串替换。以下是一个示例&#xff1a; $(patsubst…

华为多路径软件UltraPath

检查多路径是否安装。 # rpm -qa|grep UltraPath 查看UltraPath软件版本 # upadmin show version 查看物理路径状态。 #upadmin show path 查看虚拟磁盘信息。 #upadmin show vlun 查看逻辑路径状态。 #upadmin show vlun 查看多路径配置。 #upadmin show upconfig 卸载Ul…

解释器模式简介

概念&#xff1a; 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;它用于定义语言的文法&#xff0c;并解析和执行给定语言中的表达式。该模式将每个表达式表示为一个类&#xff0c;并提供了一种方式来组合这些表达式以实现复杂的语句…

竞赛选题 基于生成对抗网络的照片上色动态算法设计与实现 - 深度学习 opencv python

文章目录 1 前言1 课题背景2 GAN(生成对抗网络)2.1 简介2.2 基本原理 3 DeOldify 框架4 First Order Motion Model5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于生成对抗网络的照片上色动态算法设计与实现 该项目较为新颖&am…

Spring常考知识点(IOC、事务、容器等)

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有需要我的支持&#xff0c;请私信或评论留言&#xff01; Spring需要理解的问…

LeetCode 169. 多数元素

文章目录 一、题目二、Java 题解 一、题目 给定一个大小为 n 的数组 nums&#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 点击此处跳转题目。 示例 1&#xff…

ubuntu下网卡插入网线后仍然不连接

网卡驱动已经安装&#xff0c;在settings里可以看到该网卡设备&#xff0c;但是插入网线后仍然不会连接&#xff1a; 鼠标点击也无效。 可尝试&#xff1a; 1. ifconfig找到该网卡&#xff0c;比如我的网卡是 enx0826ae3e81aa 2. sudo ifconfig enx0826ae3e81aa down sud…

JavaScript 基础第三天笔记

JavaScript 基础第三天笔记 if 多分支语句和 switch的区别&#xff1a; 共同点 都能实现多分支选择&#xff0c; 多选1大部分情况下可以互换 区别&#xff1a; switch…case语句通常处理case为比较确定值的情况&#xff0c;而if…else…语句更加灵活&#xff0c;通常用于范围…

一个完整的项目测试方案流程应该是什么样的?

作为一名软件测试工程师&#xff0c;为项目制作完成的测试方案并执行&#xff0c;是我们日常工作的重要部分&#xff0c;同时&#xff0c;也是一名合格的软件测试工程师应有的专业素养。那么&#xff0c;很多小白和测试新手肯定要问了&#xff1a;一个完整的项目测试方案流程&a…

Java面试被问了几个简单的问题,却回答的不是很好

作者&#xff1a;逍遥Sean 简介&#xff1a;一个主修Java的Web网站\游戏服务器后端开发者 主页&#xff1a;https://blog.csdn.net/Ureliable 觉得博主文章不错的话&#xff0c;可以三连支持一下~ 如有需要我的支持&#xff0c;请私信或评论留言&#xff01; 前言 前几天参加了…

linux安装配置 flume

目录 一 解压安装包 二 配置部署 &#xff08;1&#xff09;修改配置 &#xff08;2&#xff09;下载工具 &#xff08;3&#xff09;创建配置文件 &#xff08;4&#xff09;启动监听测试 &#xff08;5&#xff09;flume监控文件 一 解压安装包 这里提供了网盘资源 链…

1688-阿里巴巴批发网(获取商品的名称,价格,图片)

1688 item_get-获得1688商品详情 为了进行电商平台 的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个1688 应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载1688 API的SDK并掌握基本的API基础…

2种方法,jmeter用一个正则提取器提取多个值!

jmeter中&#xff0c;用json提取器&#xff0c;一次提取多个值&#xff0c;这个很多人都会。但是&#xff0c;用正则提取器一次提取多个&#xff0c;是否可以呢&#xff1f; 肯定&#xff0c;很多人都自信满满的说&#xff0c;可以&#xff01;形如&#xff1a;token":“…