[设计模式] —— Flyweight 享元模式

本文介绍了Flyweight享元模式,一种通过对象共享减少内存消耗的设计模式。享元模式解决了大量细粒度对象导致的性能问题,同时保持了面向对象的编程方式。通过示例代码展示了如何实现对象池管理和重复对象的复用。

Flyweight 享元模式

属于对象性能模式,主要考虑面向对象所带来的成本问题。

动机

软件系统采用纯对象方案的问题在于大量细粒度的对象会很快充斥整个系统,从而带来很高的运行时代价。

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

定义

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

示例代码
class Font {
private:
 string key;

 // ...

public:
 Font(const string& key) {
     // ...
 }
};

class FontFactory {
private:
 map<string, Font*> fontPool;

public:
 Font* GetFont(const string& key) {
     map<string, Font*>::iterator itr = fontPool.find(key);
     if(itr != fontPool.end()) {
         return fontPool[key];
     } else {
         Font* font = new Font(key);
         fontPool[key] = font;
         return font;
     }
 }
};

我们会有一个数据结构存储现在已经产生的细粒度对象,需要根据关键字来索引,当有相同关键字的对象时,就直接返回。当发现相关 key 对象还没有创建时,则新建对象返回,并将新建的对象加入到存储队列当中,下次查找就会命中。

结构图
总结
  • Flyweight 主要考虑的是面向对象的代价问题,一般不涉及到面向对象的抽象性问题
  • Flyweight 采用对象共享的做法来降低系统中对象的个数,从而降低面向对象带来的内存压力

其他设计模式汇总:
[设计模式] —— 设计模式的介绍及分类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值