当前位置:   article > 正文

设计模式之享元模式(C++)_c++ 设计模式享元模式

c++ 设计模式享元模式

作者:翟天保Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

一、享元模式是什么?

       享元模式是一种结构型的软件设计模式,通过共享对象的方式,尽可能减少内存占用,从而达到优化的目的。

       就像打麻将,同时有10桌在玩,每桌都有4个"八筒",如果建立40个"八筒"对象,那就非常冗余,但如果用享元模式建立一套麻将牌,每桌打出"八筒"时,就调用享元中的"八筒",相当于只用了1个对象,这样即节省了资源,也完成了需求。

       上述例子中,桌号和牌号就是享元模式的外蕴状态,如A1八筒,就是A桌的第一个"八筒",A和1是外蕴状态;而卡牌"八筒"本身就是内蕴状态,内蕴是可以共享的。外蕴随环境变化,占用资源也少的多,往往只是简单的数据结构。

       享元模式的优点:

  1. 减少资源浪费。共享资源极大程度降低了系统的资源消耗。
  2. 提高系统运行效率。当资源过度使用时,系统效率会大受影响。

      享元模式的缺点:

  1. 维护共享对象,需要额外开销。
  2. 系统复杂度提高。运行享元,除了内外状态,还有线程方面都要充分考虑。

二、享元模式

2.1 结构图

       客户端即Main主函数,调用享元工厂获取享元对象。

2.2 代码示例

       场景描述:模拟组合一套八卦牌。

  1. //Flyweight.h
  2. /****************************************************/
  3. #pragma once
  4. #include <iostream>
  5. #include <unordered_map>
  6. #include <vector>
  7. #include <list>
  8. using namespace std;
  9. // 抽象享元
  10. class Flyweight
  11. {
  12. public:
  13. // 操作
  14. virtual void operation() = 0;
  15. };
  16. // 具体享元
  17. class ConcreteFlyweight : public Flyweight
  18. {
  19. public:
  20. // 构造函数
  21. ConcreteFlyweight(string name) : m_name(name) {}
  22. // 操作
  23. virtual void operation() {
  24. cout << "打出" << m_name << endl;
  25. }
  26. private:
  27. string m_name;
  28. };
  29. // 享元工厂
  30. class FlyweightFactory
  31. {
  32. public:
  33. // 析构函数
  34. ~FlyweightFactory() {
  35. for (auto it : flyweights) {
  36. cout << "销毁" << it.first << "牌" << endl;
  37. delete it.second;
  38. it.second = nullptr;
  39. }
  40. flyweights.clear();
  41. }
  42. // 获取享元
  43. Flyweight* getFlyweight(string name) {
  44. // 若没有,则创建
  45. if (flyweights.find(name) == flyweights.end()) {
  46. cout << "创建" << name << "牌" << endl;
  47. flyweights[name] = new ConcreteFlyweight(name);
  48. }
  49. else {
  50. cout << "已有" << name << "牌" << endl;
  51. }
  52. return flyweights[name];
  53. }
  54. private:
  55. std::unordered_map<string, Flyweight*> flyweights;
  56. };
  1. //main.cpp
  2. /****************************************************/
  3. #include <iostream>
  4. #include <string>
  5. #include "Flyweight.h"
  6. using namespace std;
  7. int main()
  8. {
  9. FlyweightFactory *factory = new FlyweightFactory();
  10. Flyweight* f1 = factory->getFlyweight("乾");
  11. Flyweight* f2 = factory->getFlyweight("坤");
  12. Flyweight* f3 = factory->getFlyweight("坎");
  13. Flyweight* f4 = factory->getFlyweight("离");
  14. Flyweight* f5 = factory->getFlyweight("震");
  15. Flyweight* f6 = factory->getFlyweight("巽");
  16. Flyweight* f7 = factory->getFlyweight("艮");
  17. Flyweight* f8 = factory->getFlyweight("兑");
  18. Flyweight* f9 = factory->getFlyweight("坤");
  19. f3->operation();
  20. delete factory;
  21. factory = nullptr;
  22. return 0;
  23. }

       程序结果如下。

       八卦的八个牌在初次调用时因为不存在所以创建,而第九次调用已有的坤,便不用new了。删除工厂后,析构函数别忘了将new的数据delete。

三、总结

       我尽可能用较通俗的话语和直观的代码例程,来表述我对享元模式的理解,或许有考虑不周到的地方,如果你有不同看法欢迎评论区交流!希望我举的例子能帮助你更好地理解享元模式。

       如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/395576
推荐阅读
相关标签
  

闽ICP备14008679号