C++设计模式之享元模式

C++设计模式11:享元模式 享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享对象来减少内存使用和提高性能。在该模式中,我们将需要共享的对象(如字母、数字、图形等)抽象成一个对象接口,然后通过工厂类来维护这些对象的唯一实例,并在需要的时候进行共享,避免了重复创建大量的对象。享元模式的核心思想是将一个对象的状态分成内部状态和外部状态。内部状态是可以共享的,而外部状态则需要通过参数传递进来。对于相同的内部状态,享元模式只会创建一次实例,并在需要的时候进行共享,从而节约了内存空间。 阅读详情
  • 使用场景
    当程序中使用到大量的类似对象实体时,大部分时候会出现内存不够用的情况。此时我们就可以考虑使用享元模式,一般在符合以下几点情况下来使用。1.是大量的对象 2.注重空间消耗而不是时间消耗 3.对象实体存在多种相同的内在属性。

  • 大概思想
    根据我所总结的就是将对象的大部分相同属性抽离出来实现一个共同属性结构,而其他的不共同属性保留下来让每个对象独立拥有。然后在使用的时候得先找到特有属性的共用属性结构在执行相应的操作。本质上就是时间换取空间。

  • 示例代码

#pragma once

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

struct SharedState
{
	std::string _name;
	std::string _version;

	SharedState(const std::string& name, const std::string& version)
		:_name(name),_version(version)
	{}

	SharedState(const SharedState& ss) :_name(ss._name), _version(ss._version)
	{}

	friend void info(std::ostream& os, SharedState* ss);

};

void info(std::ostream& os, SharedState* ss)
{
	os << ss->_name << " " << ss->_version<<" ";
}

struct UniqueState
{
	std::string _color;
	int _size;

	UniqueState(const std::string& color, int size)
		:_color(color),_size(size)
	{}
};

class FlyWeight
{

public:
	FlyWeight(SharedState* sharedState):_sharedState(new SharedState(*sharedState))
	{}

	FlyWeight(const FlyWeight& flyWeight):_sharedState(new SharedState(*flyWeight._sharedState))
	{}

	~FlyWeight()
	{
		if (_sharedState)
			delete _sharedState;
	}

	void doOperation(const UniqueState& uniqueState)
	{
		if (_sharedState)
			info(std::cout, _sharedState);

		std::cout << uniqueState._color << " " << uniqueState._size << std::endl;;
	}

private:

	SharedState *_sharedState;
};


class FlyWeightFacotry
{
public:
	static FlyWeightFacotry& getInstance()
	{
		static FlyWeightFacotry factory;
		return factory;
	}

	void cache(const std::string& id, FlyWeight* flyWeight)
	{
		_flyWeightMap[id] = flyWeight;
	}

	FlyWeight* getFlyWeight(const std::string& id)

	{
		if (_flyWeightMap.find(id) != _flyWeightMap.end())
			return _flyWeightMap[id];
		else
			return nullptr;
	}

	~FlyWeightFacotry(){
		for (const auto& itr : _flyWeightMap)
		{
			if (itr.second)
				delete itr.second;
		}
	}

private:
	FlyWeightFacotry() = default;
	FlyWeightFacotry(const FlyWeightFacotry& factory) = default;
	FlyWeightFacotry& operator=(const FlyWeightFacotry& factory) = default;


	std::map<std::string, FlyWeight*> _flyWeightMap;
};

void flyWeightTest()
{
	SharedState* ss1 = new SharedState("Product1", "v1.0");
	FlyWeightFacotry::getInstance().cache("v1.0", new FlyWeight(ss1));
	SharedState* ss2 = new SharedState("Product1", "v2.0");
	FlyWeightFacotry::getInstance().cache("v2.0", new FlyWeight(ss2));

	std::vector<UniqueState> uniqueStateVec = {
		{"red", 1},{"green", 2},{"blue", 3},{"white", 4}
	};

	for (const UniqueState& us : uniqueStateVec)
	{
		FlyWeight* fly1 = FlyWeightFacotry::getInstance().getFlyWeight("v1.0");
		if (fly1) fly1->doOperation(us);
		
		FlyWeight* fly2 = FlyWeightFacotry::getInstance().getFlyWeight("v2.0");
		if (fly2) fly2->doOperation(us);
	}

	delete ss1;
	delete ss2;
}
  • 示例代码里面通过构造一个享元的工厂类缓存享元对象,通过对应的标识码来取得唯一的享元对象执行相应的私有操作。

关于工厂模式的相关介绍可以看下我之前的文章
C++模板实现工厂模式

C++设计模式_13_Flyweight享元模式 运用共享技术有效地支持大量细粒度的对象。–《设计模式》GoF比如说字符串,字符串在系统中使用的量是非常大的,占用的内存也是比较大的,常见的系统包括stl等都用了一定的共享技术,java和C#会在编译器层面用一些共享技术。除了字符串,线程也是一类例子。面向对象很好地解决了抽象性的问题,但是作为一个运行在机器中的程序实体,我们需要考虑对象的代价问题。Flyweight主要解决面向对象的代价问题,一般不触发面向对象的抽象性问题。 阅读详情

相关推荐

C++设计模式之享元模式(Flyweight)

享元模式顾名思义就是羽量级模式或者蝇级模式,形容体量小的应用,该模式主要的设计目的是为了迎合系统大量相似数据的应用而生,减少用于创建和操作相似的细碎对象所花费的成本。大量的对象会消耗高内存,享元模式给出了一个解决方案,即通过共享对象来减少内存负载。 作用 通过复用相同的对象来减少对象的创建数量,创建更小的对象组,并通过共享实现重用。通过归类,将对象的属性分为内蕴状态和外蕴状态。要创建具体的享元对象,我们需要创建一个享元工厂来统一管理对象的生成和输出,享元工厂是实现享元模式的关键。 举个例子,享元模式可以看成是一个工具箱,而享元对象就是工具箱内的具体的工具,我们在使用工具的时候,不必每回临时的制

C++设计模式---享元模式

是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的内存容量中载入更多对象。

qq_29320587的博客 384

南京银行信息技术岗提前批笔试与面试

1、笔试 笔试大致可以分为三部分:性格测试、行测题目、专业知识 性格测试 性格测试一般会有较多的体量,可能一共大概有一百多道接近两百道的样子,这个是不限时的。 前面有100道是这样的题目,就是有四个选项都是各种形容词,然后分别选出最符合自己的与最不符合自己的选项。这种题你就顺着自己的潜意识填就行了,但是前后要一致,我怀疑他出这么多题,可能就是考一考你记不记得前面填了啥。比如你做到第90题的时候,可能会出现和前面第2题类似的四个形容词,更有甚者就是一模一样的,你要对自己之前选的什么有个比较清楚的记忆。

qq_40971025的博客 6922

C++设计模式(14)——享元模式

C++ 享元模式

伍粟的博客 1275

Android开发- (2)MediaProjection API实战:构建高效屏幕共享与远程控制方案

本文深入探讨了Android开发中利用MediaProjection API实现高效屏幕共享与远程控制方案的实战方法。文章从权限申请、虚拟屏幕创建讲起,详细解析了图像捕获、编码压缩、Socket网络传输的核心流程,并进一步介绍了如何构建双向控制通道及关键的性能优化与避坑指南,为开发者构建稳定可用的远程协作应用提供了完整路径。

weixin_29207533的博客 452

MiniMAX H3官方SKILL三段式提示词模板与本地部署全解

视频生成模型的效果高度依赖于提示词的结构与质量,而提示词工程正是连接自然语言与视觉表达的关键桥梁。在文本模型之外,视频模型对场景、角色、镜头动作的信息层次更为敏感,普通自由描述往往导致画面漂移、风格不稳定。MiniMAX H3 作为社区热议的视频生成模型,通过一套官方 SKILL 三段式提示词模板,将环境、主体、镜头动作分类组织,免API、免推理即可稳定产出风格统一的素材。这一设计不仅降低了提示词编写门槛,也提升了多轮生成的复用性,适合短视频生产、影视概念设计及自动化视频流水线等场景。本文围绕该模板的结构与

weixin_33309048的博客 1178

C++设计模式结构型模式———享元模式

享元对象最重要的就是对“内部状态”和“外部状态”做出了明确的区分,这是享元对象能够被共享的关键所在。内部状态:存储在享元对象内部的,一直不会发生改变的状态,这种状态可以被共享。例如,对于BlackPiece类对象,它的内部状态就是黑棋子,它一直代表黑棋子,不会发生改变。而对于WhitePiece类对象,它的内部状态就是白棋子,它一直代表白棋子,不会发生改变。内部状态一般可以作为享元类的成员变量而存在。外部状态:随着着外部环境和各种动作因素的改变而发生改变的状态,这种状态不可以被共享。

无敌岩雀的博客 1571

SpringSecurity(15)——OAuth2密码模式

SpringSecurity Oauth2密码模式

peng_gx的博客 1521

C++ 享元模式

C++ 享元模式

索命的博客 501

基于ASP.NET+SQLServer的美妆网站的设计与实现

通过本次ASP.NET MVC美妆商城项目的开发,我们实现了一个功能完善、性能稳定的在线购物平台。该项目不仅提升了用户的购物体验,也为商家提供了一个高效的商品管理和销售渠道。未来,我们将持续优化系统功能,提升用户体验,以适应不断变化的市场需求。

毕业设计大牛哥 1500

一文搞定 GitHub SSH Key:生成、配置、好处全攻略

本文详细介绍了如何配置GitHub SSH Key,实现免密安全认证。主要内容包括:SSH协议的四大优势(免密登录、安全性高、稳定省心、支持自动化);Git身份配置步骤;检查本地SSH Key;生成RSA密钥对;添加密钥到SSH代理;复制公钥到GitHub;测试连接。配置完成后,开发者可通过SSH地址克隆仓库,实现push/pull全程免密操作。该方案显著提升Git使用效率,同时保障安全性,是开发者必备技能。

qq_62904883的博客 958

C++ 设计模式——享元模式

享元模式也称为蝇量模式旨在解决面向对象程序设计中的性能问题。享元的英文名“Flyweight”意为“轻量级”,源于拳击比赛中较轻的选手。该模式的核心目标是让对象变得“轻”,即减少内存占用。在需要某个对象时,尽量共享已经创建的同类对象,以避免频繁使用 `new` 创建同类或相似的对象。在对象数量非常庞大的情况下,这种共享可以显著节省内存占用并提升程序运行效率。

慢慢记录,慢慢更新。 2028

YOLOv12创新改进 | 全网独家创新篇、小目标检测改进 | AAAI 2025 | 引入HS-FPN中的HFP和SDP创新点,从频域增强小目标特征,淘汰FPN进行升级,助力YOLOv12有效涨点

本文提出了HS-FPN(高频和空间感知特征金字塔网络),通过HFP(高频感知)模块增强小目标特征,SDP(空间依赖感知)模块捕获像素间空间依赖关系。实验在AI-TOD等小目标数据集上验证了该方法的有效性,相比FPN显著提升检测性能。文章详细介绍了HS-FPN的网络结构、核心代码实现及在YOLOv12中的应用方法,并提供多种改进版本的yaml配置文件,为小目标检测任务提供了有效的解决方案。

Ai缝合怪、助力小伙伴高效发论文 338

C++设计模式——享元模式(flyweight pattern)

# 一、原理讲解 ## 1.1意图 运用共享技术有效地支持大量细粒度的对象。 ## 1.2应用场景 - 一个程序中使用了大量的对象; - 完全由于使用大量的对象造成很大的存储开销; - 对象的大多数状态都可变为外部状态; - 如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象; - 应用程序不依赖于对象标识。 ## 1.3结构图(UML图) ![享元模式UML结构图](https://img-blog.csdnimg.cn/20200902222642384.jpg?x-oss-

净无邪博客 547

OpenCASCADE完整教程专栏完整目录

OpenCASCADE完整教程专栏完整目录

希望我的博客,能帮上你解决学习中工作中所遇到的问题 9703

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【c++设计模式14】结构型6:享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享对象来减少内存使用和提高性能。享元模式将对象分为两部分:内部状态(Intrinsic State)和外部状态(Extrinsic State)。其中,内部状态是可以共享的,而外部状态是不可共享的。

junxuezheng的博客 1135

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C++设计模式——享元模式(Flyweight Pattern)

C++设计模式——享元模式(Flyweight Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——享元模式(Flyweight Pattern)目录定义定义结构代码示例总结对比优缺点适用场景参考资料 定义 定义 Flyweight Pattern: Use sharing to support large numbers of fine-grained objects efficiently. 使用共享对象可有效地支持大量的细粒度的对象 享元(Flyweight)模式的定义

leonardohaig的博客 1288

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C++ 设计模式:享元模式(Flyweight Pattern)

C++ 设计模式:享元模式(Flyweight Pattern)

冀晓武的博客 837

C++ 设计模式之享元模式

C++ 设计模式之享元模式

L_qingting的博客 716

C++设计模式——享元模式

C++设计模式——享元模式 2014-01-07 分类:C++ / 设计模式 阅读(634) 评论(12)  前言 无聊的时候,也去QQ游戏大厅玩五子棋或者象棋;作为程序员,看到一个产品,总要去想想它是怎么设计的,怎么完成的,我想这个是所有程序员都会做的事情吧(强迫症???)。有的时候,想完了,还要做一个DEMO出来,才能体现自己的NB,然后还有点小成就感。 在玩五子棋或象棋

风叶 819

C++工程,C++设计模式-享元模式

文章目录1,运行结果 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200224194007685.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzM3NTQyNTI0,size_16,col...

m0_37542524的博客 258

C++设计模式 - 享元模式(Flyweight)

享元模式:运用共享技术有效地支持大量细粒度的对象。 动机 在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价一主要指内存需求方面的代价。 如何在避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面向对象的方式来进行操作? 总结 面向对象很好地解决了抽象性的问题,但是作为一个运行在机器中的程序实体我们需要考 虑对象的代价问题。Flyweight主要解决面向对象的代价问题,一般不触及 面向对象的抽象性问题。 Flyweight采用对象共享的做法来降

Cdreamfly的博客 1336

【C++设计模式】享元模式

#ifndef __FLYWEIGHT_H__ #define __FLYWEIGHT_H__ #include &lt;string&gt; #include &lt;map&gt; //【说明】 // 当系统中细粒度对象数量太多时,会导致运行代价过高,带来性能下降等问题。享元模式正是为解决这一类问题而诞生的。 // 在享元模式中通常会出现工厂模式,需要创建一个享元工厂来负责维护一个享元池...

zxh2075的专栏 957
上一篇: Qt利用QFile内存映射实现进程间通信
下一篇: 浅析C++写时复制机制(copy-on-write)
小乖zypher
博客等级 码龄9年 4粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值