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

devtools/2024/10/18 7:51:39/

前言

        面向对象很好地解决了 “抽象” 的问题,但是不可避免的要付出一定的代价。对于通常情况来讲,面向对象的成本大都可以忽略不计。但是某些情况,面向对象所带来的成本必须谨慎处理

        具体需要自己根据需求去评估

定义

        “对象性能” 模式。运用共享技术有效的支持大量细粒度对象        

动机

        在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行代价——主要指内存需求方面的代价

        如何在避免大量细粒度对象的同时,让外部客户程序仍然能够透明地使用面向对象的方式来进行操作?        

案例

        代码

class Font {
private://unique object keystring key;//object state//....public:Font(const string& key){//...}
};
ßclass FontFactory{
private:map<string,Font* > fontPool;public:Font* GetFont(const string& key){map<string,Font*>::iterator item=fontPool.find(key);if(item!=footPool.end()){return fontPool[key];}else{Font* font = new Font(key);fontPool[key]= font;return font;}}void clear(){//...}
};

类图

        

总结

        面向对象很好地解决了抽象性的问题,但作为一个运行在机器中的程序实体,我们需要考虑对象的代价问题。享元主要解决面向对象的代价问题,一般不触及面向对象的抽象性问题

        享元采用对象共享的方式来降低系统中的对象个数,从而降低细粒度对象对系统带来的内存压力。再具体实现方面,需要注意对象状态的处理

        对象的数量太大从而导致对象内存开销加大——什么样的数量才算大?这需要我们仔细地根据具体应用情况进行评估,不能凭空臆断


http://www.ppmy.cn/devtools/117909.html

相关文章

【WebLogic】WebLogic 11g 控制台模式下安装记录

WebLogic 11g的安装有三种方式&#xff1a; 1&#xff09;GUI图形化模式&#xff1b; 2&#xff09;控制台模式&#xff1b; 3&#xff09;静默模式&#xff1b; 下面为大家展示下控制台模式下的安装过程记录&#xff0c;整个安装过程大部分都是回车&#xff0c;仅在【接收…

无人机表演中其关键功能有哪些!

1. 集群控制与协同作业 高效通信系统&#xff1a;通常包括无线通信技术&#xff0c;如Wi-Fi、Zigbee或专用的无线频段&#xff0c;以实现无人机与地面控制站、无人机之间的实时数据交换。 集群控制算法&#xff1a;通过先进的集群控制算法&#xff0c;确保无人机在飞行过程中…

stm32f072c8t6用STM32CubeProgrammer的usb下载连接不上的问题

最近做3D打印的主板, 主控是用的stm32f072的芯片, 我发现电脑能识别到stmbootloader, 但是在连接的时候就提示读保护 Device is under read out protection ! If you want to disable RDP please reconnect with Read Unprotect enabled 我试了很多次, 困扰了我好几天, 我怀疑…

TypeScript 设计模式之【装饰模式】

文章目录 **装饰模式**&#xff1a;为你的对象穿上华丽的外衣装饰者的魔法装饰模式有什么利与害&#xff1f;如何使用装饰者来美化你的对象代码实现案例装饰模式的主要优点装饰模式的主要缺点装饰模式的适用场景总结 装饰模式&#xff1a;为你的对象穿上华丽的外衣 嘿程序员&a…

学习C++的第七天!

1.虚函数是在基类中用 virtual 关键字声明的函数&#xff0c;可以在派生类中被重写。纯虚函数是在虚函数的基础上&#xff0c;在基类中被初始化为 0 的函数&#xff0c;含有纯虚函数的类是抽象类&#xff0c;不能被实例化。 2.如果基类的析构函数不是虚函数&#xff0c;当通过…

【Vue】以RuoYi框架前端为例,ElementUI封装图片上传组件——将图片信息转成base64后提交到后端保存

RuoYi 框架本身对于图片上传功能&#xff0c;在ElementUI的 <el-upload> 组件的基础装封装了 /components/ImageUpload/index.vue 组件。本组件就是在 RuoYi 自定义的 <ImageUpload> 组件的基础上进行改造&#xff0c;将图片的信息在上传之前处理成 base64 格式&am…

基于matlab语音滤波系统

实验目的 1、学会MATLAB的使用&#xff0c;掌握其程序设计方法&#xff0c;学会对信号进行分析和处理&#xff1b; 2、掌握语音信号的采集、存储和时频分析&#xff1b; 3、要求掌握IIR数字滤波器的设计原理、设计方法和设计步骤&#xff1b; 4、学习用窗函数法设计FIR数字…

【Linux实践】实验七:vi编辑器的使用

【Linux实践】实验七&#xff1a;vi编辑器的使用 实验目的实验内容实验步骤及结果1. 挂载磁盘2. vi编辑器3. 使用 vi 创建文件4. 扩展功能 实验目的 7、掌握挂载和卸载文件系统的方法。 8、掌握vi编辑器的使用方法。 实验内容 1、使用命令挂载U盘&#xff0c;并能正确显示U盘…