当前位置: 首页 > news >正文

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

前言

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

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

定义

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

动机

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

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

案例

        代码

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(){//...}
};

类图

        

总结

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

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

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

相关文章:

  • mac-m1安装nvm,docker,miniconda
  • 基于SpringBoot+Vue的小儿推拿培训管理系统
  • [SAP ABAP] SELECTION-SCREEN
  • mac 外接键盘
  • 手机/平板端 Wallpaper 动态壁纸文件获取及白嫖使用指南
  • AURIX单片机示例:开发入门与点亮LED
  • 2015年国赛高教杯数学建模B题互联网+时代的出租车资源配置解题全过程文档及程序
  • Ansible-template模块动态生成特定文件
  • docker常用命令、如何查看docker 镜像的sha256值
  • TCP网络编程概述、相关函数、及实现超详解
  • 【frp】frp重启、frp启动、frp后台启动、frps dashboard等等
  • Linux网络:网络编程套接字
  • 【web网页制作】html+css旅游家乡河南开封主题网页制作(4页面)【附源码】
  • Linux基础命令cd详解
  • 如果解决获取数据抖动的问题
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 230. Kth Smallest Element in a BST
  • ES6语法详解(一)
  • HTTP那些事
  • javascript 总结(常用工具类的封装)
  • Material Design
  • React16时代,该用什么姿势写 React ?
  • 高程读书笔记 第六章 面向对象程序设计
  • 聊聊flink的TableFactory
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 使用common-codec进行md5加密
  • 微信小程序设置上一页数据
  • 硬币翻转问题,区间操作
  • 阿里云服务器如何修改远程端口?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • !!Dom4j 学习笔记
  • #100天计划# 2013年9月29日
  • #if 1...#endif
  • $.ajax,axios,fetch三种ajax请求的区别
  • $refs 、$nextTic、动态组件、name的使用
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (1)常见O(n^2)排序算法解析
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (简单) HDU 2612 Find a way,BFS。
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (顺序)容器的好伴侣 --- 容器适配器
  • (学习总结)STM32CubeMX HAL库 学习笔记撰写心得
  • (一)u-boot-nand.bin的下载
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (一)面试需要掌握的技巧
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (原创)可支持最大高度的NestedScrollView
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • **python多态
  • . NET自动找可写目录
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes