Flyweight 亨元模式

享元模式是一种设计模式,旨在通过对象共享减少系统中细粒度对象的数量,从而降低内存开销。它在不牺牲面向对象特性的前提下,通过共享技术实现对象的高效复用。例如,字符串常量池就应用了这一思想。模式的核心是Flyweight类,它负责共享对象,并在具体实现时处理对象状态。此模式通常用于性能敏感的场景,创建的对象通常是只读的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

动机

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

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

模式定义

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

实例

每一个字符都是一个字体 字体对象Font

class Font{
private:
    //unique object key
    string key;

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

class FontFactory{
private:
    map<string,Font*>fontPool;
public:
    Font* GetFont(const string& key){
        map<key,Font*>:: iterator iten = fontPool.find(key);

        if(item != footPool.end()){
            return fontPool[key];
        }
        else{
            Font* font = new Font();
            fontPool[key] = font;
            return font;
        }
    }
    void clear(){
        //..
    }
}

结构

在这里插入图片描述

要点总结

  • 面向对象很好地解决了抽象性地问题。但是作为一个运行在机器中的程序实体,我们需要考虑对象的代价问题。Flyweight主要解决面向对象的代价问题。一般不触及面向对象的抽象性问题。
  • flyweight采用对象共享的做法来降低系统中对象的个数,从而降低细粒度对象给系统带来的压力。在具体实现方面,要注意对象状态的处理
  • ”对象的数量太大“这一说法没有具体的定义

笔记。

  • 用共享的方式公用对象
  • 其实这也是共享池的设计方式
  • 有很多不同的实现方式
  • 字符串常量池就是使用了这种思想
  • 只有Flyweight和Singteton模式解决的是性能问题 而不是抽象问题
  • 这种模式创建出来的对象一般是只读的 否则共享不成立
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值