C++享元模式(Flyweight)

    xiaoxiao2023-11-28  155

    UML类图(仅供参考)如下:

    享元模式解决的问题:

    主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。运用共享技术有效地支持大量细粒度的对象。在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。

    源码

    #include <iostream> #include <string> #include <vector> // 基类,定义操作接口Operation class CFlyweight { public: //操作外部状态extrinsicStatus virtual void Operation(const std::string& extrinsicStatus) = 0; std::string GetIntrinsicStatus() { return _intrinsicStatus; } virtual ~CFlyweight() {} protected: CFlyweight(std::string intrinsicStatus) :_intrinsicStatus(intrinsicStatus) {} private: //内部状态,也可以放在ConcreteFlyweight中 std::string _intrinsicStatus; }; // 需要共享的类 class CConcreteFlyweight :public CFlyweight { public: CConcreteFlyweight(std::string intrinsicStatus) :CFlyweight(intrinsicStatus) {} //实现接口函数 virtual void Operation(const std::string& extrinsicStatus) { std::cout << GetIntrinsicStatus() << std::endl; std::cout << extrinsicStatus << std::endl; } }; // 不需要共享的类 class CUnsharedConcreteFlyweight :public CFlyweight { public: CUnsharedConcreteFlyweight(std::string intrinsicStatus) :CFlyweight(intrinsicStatus) {} //实现接口函数 virtual void Operation(const std::string& extrinsicStatus) { std::cout << GetIntrinsicStatus() << std::endl; std::cout << extrinsicStatus << std::endl; } }; class CFlyweightFactory { public: ~CFlyweightFactory() { for (auto iter = m_vecFly.begin(); iter != m_vecFly.end(); ++iter) { delete *iter; } m_vecFly.clear(); } //获得一个请求的Flyweight对象 CFlyweight* GetFlyweight(std::string key) { for (auto iter = m_vecFly.begin(); iter != m_vecFly.end(); ++iter) { if ((*iter)->GetIntrinsicStatus() == key) { return (*iter); } } CFlyweight *fly = new CConcreteFlyweight(key); m_vecFly.push_back(fly); return fly; } //获取容器中存储的对象数量 void GetFlyweightCount() { std::cout << m_vecFly.size() << std::endl; } private: //保存内部状态对象的容器 std::vector<CFlyweight*> m_vecFly; }; int main() { //外部状态extrinsicStatus std::string extrinsicStatus = "ext"; //工厂对象 CFlyweightFactory *fc = new CFlyweightFactory(); //向工厂申请一个Flyweight对象,且该对象的内部状态值为“hello” CFlyweight *fly1 = fc->GetFlyweight("hello"); CFlyweight *fly2 = fc->GetFlyweight("hello"); //应用外部状态 fly2->Operation(extrinsicStatus); fc->GetFlyweightCount(); return 0; }

    好处

    大大减少对象的创建,降低系统的内存,使效率提高

    最新回复(0)