首页 > 其他分享 >享元模式 Flyweight

享元模式 Flyweight

时间:2022-09-28 00:00:23浏览次数:52  
标签:享元 fontPool Flyweight 对象 模式 itor 面向对象 key Font

“对象性能”模式

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

动机(Motivation)

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

模式定义

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

// 线程池啥的可以用这个。

示例

#include<iostream>
#include<string>
#include<map>

using namespace  std;

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

public:
    Font(const string& key) {
        //...
        this->key = key;
    }
    void showInfo() {
        cout << "字体 = " << key << endl;
    }
};


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

    void clear() {
        //...
        map<string, Font *>::iterator itor = fontPool.begin();
        while (itor != fontPool.end()) {
            delete (*itor).second;
            (*itor).second = nullptr;
            itor = fontPool.erase(itor); // 指向下一个
        }

        //fontPool.clear();
        cout << fontPool.size() << endl;
    }
};

int main()
{
    FontFactory fontFactory;
    Font *font1 = fontFactory.GetFont("ABC");
    font1->showInfo();
    Font *font2 = fontFactory.GetFont("ABC");
    font2->showInfo();

    fontFactory.clear();
    getchar();
    return 0;
}

输出:

字体 = ABC
字体 = ABC
0

类图

要点总结

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




参考:GeekBand

标签:享元,fontPool,Flyweight,对象,模式,itor,面向对象,key,Font
From: https://www.cnblogs.com/huvjie/p/16736413.html

相关文章

  • vue-router有几种模式
    1.hash模式:URL中hash值只是客户端的一种状态,也就是说当向服务器发出请求时,hash部分不会被发送;hash值的改变,都会在浏览器的访问历史中增加一个记录,因此我们能够通过浏览器......
  • 单例模式 Singleton
    “对象性能”模式面向对象很好地解决了“抽象”的问题,但是必不可免地要付出一定的代价。对于通常情况来讲,面向对象的成本大都可以忽略不计。但是某些情况,面向对象所带来......
  • 大话设计模式 ---- 第一章简单工厂笔记
    第一章简单工厂模式计算器实现建民哥在大二的时候让我们设计一个口算卡我第一版的设计模式:(虽然功能实现了,但是啥也不是,一旦有新要求需要大改程序直接作废)//......
  • 设计模式(十四)----结构型模式之外观模式 已完成
    1概述有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好......
  • 9-27 设计模式
    工厂模式:通过创建接口来实现使用接口的类来具体进行具体各自的独特行为,然后创建工厂,工厂可以将所有的继承的接口类都进行选择性的包容下,并可以供给使用者的需求来创建实......
  • 行为型设计模式之状态模式
    状态模式状态模式(StatePattern)属于行为型模式。它是允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。状态模式中类的行为是由状态决定的,不同......
  • GB/T28181-2016 SDP定义和音视频传输模式解读
     SDP定义联网系统中SIP消息体中携带的SDP内容应符合IETFRFC2327的相关要求。应有如下字段:Sessiondescription:v=(protocolversion)o=(owner/creatorandsessioni......
  • 编码中的Adapter,不仅是一种设计模式,更是一种架构理念与解决方案
    大家好,又见面了。不知道下面这玩意大家有没有见过或者使用过?这是一个插座转换器。我们都知道日常使用的是220v的交流电,而国外不同国家使用的电流电压是不一样的(比如日本使......
  • JAVA设计模式-原型模式
    JAVA设计模式-原型模式介绍原型模式是一种创建型模式,用于创建重复的对象,并且保证性能。原型模式创建的对象是由原型对象自身创建的,是原型对象的一个克隆,和原型对象具有......
  • 构建器模式 Builder
    “对象创建”模式通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。典型模式......