享元模式(C++)

定义

运用共享技术有效地支持大量细粒度的对象。

使用场景

  • 在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价。
  • 如何在避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面向对象的方式来进行操作?

结构

在这里插入图片描述

代码示例

//Flyweight.h
/****************************************************/
#ifndef FLYWEIGHT_H
#define FLYWEIGHT_H
#include<iostream>
#include<map>
using namespace std; //享元模式 class Flyweight  //抽象的享元类
{
public :virtual void Operator(int i) = 0;
};class ConcreteFlyweight : public Flyweight  //共享的子类
{
public:void Operator(int i){cout <<"共享的Flyweight: " << i<<endl;}
};class UnshareConcreteFlyweight : public Flyweight
{void Operation(int i){cout << "不共享的Flyweight : " << i << endl;}
};class FlyweightFactory  //享元工厂
{
private: map<string, Flyweight*> flyweights;  //模块名列表
public:FlyweightFactory(){//这里需要用堆,因为这是给客户程序返回的,如果不用堆,则会返回局部对象的引用flyweights["x"] = new ConcreteFlyweight();flyweights["y"] = new ConcreteFlyweight();flyweights["z"] = new ConcreteFlyweight();//所有的属性为“z”的模块都只对应这个一个实例,这正是享元模式的精髓所在呀}Flyweight* GetFlyWeight(string key){if (!flyweights.count(key))flyweights[key] = new ConcreteFlyweight();return flyweights[key];}map<string, Flyweight*>::size_type CountN()//返回当前可共享的模块数{return flyweights.size();}};#endif
//test.cpp
/****************************************************/
#include "Flyweight.h"
int main()
{int i = 100;FlyweightFactory f;//整个过程采用一个工厂Flyweight *px = f.GetFlyWeight("x");//获取x对应的模块px->Operator(--i);Flyweight* py = f.GetFlyWeight("y");//获取x对应的模块py->Operator(--i);Flyweight* pz = f.GetFlyWeight("a");//a不在初始化的表中pz->Operator(--i);//原来就有 x,y,z  加上现在的a 一共4个 cout << "可共享的模块:"<<f.CountN() <<"个!" << endl;delete px;delete py;delete pz;px = py = pz = NULL;return 0;
}

运行结果
在这里插入图片描述

要点总结

  • 面向对象很好地解决了抽象性的问题,但是作为一个运行在机器中的程序实体,我们需要考虑对象的代价问题。Flyweight主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题。
  • Flyweight采用对象共享的做法来降低系统中对象的个数,从而降低细粒度对象给系统带来的内存压力。在具体实现方面,要注意对象状态的处理。
  • 对象的数量太大从而导致对象内存开销加大——什么样的数量才算大?这需要我们仔细的根据具体应用情况进行评估,而不能凭空臆断。

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

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

相关文章

JavaWeb过滤器

目录 接口中的方法 init destroy doFilter 在web.xml中配置 作用 Filter也称之为过滤器&#xff0c;它是Servlet技术中最实用的技术&#xff0c;WEB开发人员通过 Filter技术&#xff0c;对web服务器管理的所有web资源&#xff1a;例如Servlet, 从而实现一些 特殊的功能。…

虚拟ip地址软件 怎么修改自己的网络ip地址

修改自己的网络IP地址在日常生活中&#xff0c;有时候我们可能需要修改自己的网络IP地址&#xff0c;这可能是由于网络问题、安全性考虑、建议使用第三方深度ip转换器切换ip地址。不用担心&#xff0c;下面将为大家介绍几种常见的修改网络IP地址的方法。 1. 通过重新连接网络&a…

128.【Maven】

Maven仓库 (一)、Maven 简介1.传统项目管理的缺点2.Maven是什么3.Maven的作用 (二)、Maven 的下载与安装1.下载与认识目录2.配置Maven的全局环境 (三)、Maven 的基础概念1.Maven 仓库(1).仓库分类 2. Maven 坐标3.Maven 本地仓库配置(1).改变默认的仓库地址(2).改变远程仓库地址…

mac电脑 node 基本操作命令

1. 查看node的版本 node -v2. 查看可安装的node版本 sudo npm view node versions3. 安装指定版本的node sudo n 18.9.04. 安装最新版本node sudo n latest5. 安装最新稳定版 sudo n stable6. 清楚node缓存 sudo npm cache clean -f7. 列举已经安装的node版本 n ls 8. 在…

代码随想录算法训练营第46天| 139.单词拆分 关于多重背包,你该了解这些! 背包问题总结篇!

今日学习的文章链接&#xff0c;或者视频链接 第九章 动态规划part08 自己看到题目的第一想法 看完代码随想录之后的想法 139: class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.b…

【并发编程】无锁环形队列Disruptor并发框架使用

Disruptor 是苹国外厂本易公司LMAX开发的一个高件能列&#xff0c;研发的初夷是解决内存队列的延识问顾在性能测试中发现竟然与10操作处于同样的数量级)&#xff0c;基于Disruptor开发的系统单线程能支撑每秒600万订单&#xff0c;2010年在QCn演讲后&#xff0c;获得了业界关注…

c++11-14-17_内存管理(RAII)_多线程

文章目录 前言&#xff1a;什么是RAII&#xff1f;指针/智能指针&#xff1a;使用智能指针管理内存资源&#xff1a;unique_ptr的使用&#xff1a;自定义删除器&#xff1a; shared_ptr的使用&#xff1a;shared_ptr指向同一个对象的不同成员&#xff1a;自定义删除函数&#x…

期权定价模型系列【2】—期权的希腊字母计算及应用

本篇文章旨在介绍期权常见希腊字母的计算及应用 本专栏更多侧重于理论及文字方面的展示&#xff0c;文章具体的代码可以参考我的另一个专栏【期权量化】。 【期权量化】专栏有同名文章&#xff0c;并且给出了文章的具体代码。 专栏地址&#xff1a; http://t.csdn.cn/Y30Hk…

谈谈Java开发语言

目录 1.概念 2.特点 3.应用领域 4.就业情况 1.概念 Java是一种面向对象的编程语言&#xff0c;它由James Gosling和他的团队在1995年于Sun Microsystems&#xff08;现在是Oracle Corporation&#xff09;开发出来。Java的设计目标是让开发者能够编写一次代码&#xff0c;在…

Arcgis中POI找到建筑面内距离最近的标准地址通过模型构建器来实现

背景 之前写过一篇文章 Arcgis通过矢量建筑面找到POI对应的标准地址 这里面的大致思路跟本篇文章是类似的&#xff0c;不过上一篇文章有部分有瑕疵&#xff0c;就是在POI去找建筑面内的标准地址时&#xff0c;找到的虽然是建筑面内的&#xff0c;但是不一定是距离最近的&#…

登录界面中图片验证码的生成和校验

一、用pillpw生成图片验证码 1、安装pillow pip install pip install pillow2、下载字体 比如&#xff1a;Monaco.ttf 3、实现生成验证码的方法 该方法返回一个img ,可以把这个img图片保存到内存中&#xff0c;也可以以文件形式保存到磁盘&#xff0c;还返回了验证码的文字…

走出象牙塔:李郓梁的区块链实践之路丨对话MVP

如何从科研走向实践&#xff1f;李郓梁在社区找到了答案。 作为西安工业大学的硕士研究生&#xff0c;李郓梁从学校的实验室接触区块链技术。通过研读大量论文&#xff0c;李郓梁为区块链多中心化、不可篡改等前沿理论深深着迷&#xff0c;并选择将区块链作为主要研究方向&…

[前端系列第1弹]HTML入门教程:从零开始学习Web页面的基础知识

HTML是一种用于描述Web页面内容和结构的标记语言&#xff0c;它由一系列的标签&#xff08;tag&#xff09;组成&#xff0c;每个标签都有特定的含义和功能。HTML标签可以嵌套使用&#xff0c;形成一个树状的文档对象模型&#xff08;Document Object Model, DOM&#xff09;。…

使用gewe框架进行微信群组管理(一)

友情链接&#xff1a;geweapi.com 点击访问即可。 管理员操作 小提示&#xff1a; 添加、删除、转让多个wxid时仅限于添加/删除管理员&#xff0c;1添加 2删除 3转让 请求URL&#xff1a; http://域名地址/api/group/admin 请求方式&#xff1a; POST 请求头&#xff1a…

PlayCanvas初学问题汇总

pc.Application类型错误 // Expose prototype methods and create a default tween manager on the application (function () {// Add pc.Application#addTweenManager methodpc.Application.prototype.addTweenManager function () {this._tweenManager new pc.TweenManag…

C++实现一键关闭桌面

方法一&#xff1a; C关闭桌面,explorer.exe #include<Windows.h> #include <TlHelp32.h> #include"resource.h" #pragma warning(disable:4996) void taskkill(const char * name) {HANDLE info_handle CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,…

Jmeter —— jmeter设置HTTP信息头管理器模拟请求头

HTTP信息头管理器 HTTP信息头管理器是在有需要模拟请求头部的时候进行设置的&#xff0c;添加方式 是 右击线程组 -- 配置元件 -- HTTP信息头管理器 可以通过抓包工具或者F12获取http请求的header头部信息&#xff1b;如下图&#xff1a; 复制并点击jmeter中的从剪贴板添加&am…

element-plus里,设置Message消息提示框组件显示的位置,垂直居中

element-plus里的 Message 组件&#xff0c;默认展示的位置在最顶部&#xff0c;依次往下叠加&#xff0c;如图所示 想要解决它显示的位置&#xff0c;可以使用组件里的 offset属性&#xff0c;设置 Message 距离窗口顶部的偏移量,想要垂直居中&#xff0c;可以这么设置&#…

2.若依前后端分离版第一个增删查改

1.介绍 若依提供了代码生成功能&#xff0c;单表的CRUD可以直接用若依框架提供的代码生成进行创建。 2.实现 2.1 在数据库创建业务表test_teacher 2.2 生成代码 运行系统&#xff0c;进入菜单[系统工具]-》[代码生成],点击导入按钮&#xff0c;选择需要生成代码的表进行导…

Vue3中使用TDesign添加动态表单校验

html部分 注意这里的data和收集数据的动态表单要有层级关系 <t-form ref"form_ref" label-width"0" :data"form_data"><div class"flex gap-5" v-for"(item, index) in form_data.address "><t-form-item…