【GeekBand】C++设计模式笔记13_Flyweight_享元模式

devtools/2024/11/18 14:46:52/

1. “对象性能” 模式

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

2. Flyweight 享元模式

2.1 动机(Motivation)

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

2.2 模式定义

运用共享技术有效地支持大量细粒度的对象。
——《设计模式》GoF

2.3 实例代码


class Font {
private:// unique object keystring key;// object state// ....public:Font(const string& key) {// ...}
};class FontFactory {
private:// 对象池map<string, Font*> fontPool;public:// 根据key来返回特定的对象Font* GetFont(const string& key) {// 检查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() {// ...}
};

2.4 结构(Structure)

在这里插入图片描述

2.5 要点总结

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

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

相关文章

论文阅读 - Causally Regularized Learning with Agnostic Data Selection

代码链接&#xff1a; GitHub - HMTTT/CRLR: CRLR尝试实现 https://arxiv.org/pdf/1708.06656v2 目录 摘要 INTRODUCTION 2 RELATED WORK 3 CAUSALLY REGULARIZED LOGISTIC REGRESSION 3.1 Problem Formulation 3.2 Confounder Balancing 3.3 Causally Regularized Lo…

【微软:多模态基础模型】(3)视觉生成

欢迎关注【youcans的AGI学习笔记】原创作品 【微软&#xff1a;多模态基础模型】&#xff08;1&#xff09;从专家到通用助手 【微软&#xff1a;多模态基础模型】&#xff08;2&#xff09;视觉理解 【微软&#xff1a;多模态基础模型】&#xff08;3&#xff09;视觉生成 【微…

163页PPT丨甲方集团业务流程架构顶层规划及销售到回款方案

EPF&#xff08;Enterprise Process Framework&#xff0c;企业流程框架&#xff09;咨询与业务蓝图设计是企业战略规划与管理中的重要组成部分&#xff0c;它们共同致力于优化企业业务流程&#xff0c;提升运营效率&#xff0c;确保企业能够适应市场变化并实现可持续发展。以下…

PyTorch——从入门到精通:PyTorch基础知识(张量)【PyTorch系统学习】

什么是张量&#xff08;Tensor&#xff09; ​ 张量在数学中是一个代数对象&#xff0c;描述了与矢量空间相关的代数对象集之间的多重线性映射。张量是向量和矩阵概念的推广&#xff0c;可以理解为多维数组。作为数学中的一个基本概念&#xff0c;张量有着多种类型&#xff0c;…

第六章元素应用CSS

6.1 使用CSS设置字体样式 6.1.1.字体类型 字体具有两方面的作用:一是传递语义功能&#xff0c;二是有美学效应。 font-family:字体名称; 参数:字体名称按优先顺序排列&#xff0c;以逗号隔开。如果字体名称包含空格&#xff0c;则应用引号括起。 说明:用 font-family 属性可控…

【Python · PyTorch】卷积神经网络(基础概念)

【Python PyTorch】卷积神经网络 CNN&#xff08;基础概念&#xff09; 0. 生物学相似性1. 概念1.1 定义1.2 优势1.2.1 权重共享1.2.2 局部连接1.2.3 层次结构 1.3 结构1.4 数据预处理1.4.1 标签编码① One-Hot编码 / 独热编码② Word Embedding / 词嵌入 1.4.2 归一化① Min-…

【ArcGIS微课1000例】0127:计算城市之间的距离

本文讲述,在ArcGIS中,计算城市(以地级城市为例)之间的距离,效果如下图所示: 一、数据准备 加载配套实验数据包中的地级市和行政区划矢量数据(订阅专栏后,从私信查收数据),如下图所示: 二、计算距离 1. 计算邻近表 ArcGIS提供了计算点和另外点之间距离的工具:分析…

scala 迭代更新

在Scala中&#xff0c;迭代器&#xff08;Iterator&#xff09;是一种用于遍历集合&#xff08;如数组、列表、集合等&#xff09;的元素而不暴露其底层表示的对象。迭代器提供了一种统一的方法来访问集合中的元素&#xff0c;而无需关心集合的具体实现。 在Scala中&#xff0c…