当前位置:   article > 正文

大话设计模式之享元模式

大话设计模式之享元模式

享元模式是一种结构型设计模式,旨在有效地支持大量细粒度的对象共享,从而减少内存消耗和提高性能。

在享元模式中,对象分为两种:内部状态(Intrinsic State)和外部状态(Extrinsic State)。内部状态是对象可以共享的状态,它存储在享元对象内部,并且不会随着外部环境的改变而改变;外部状态是对象的外部环境可以变化的部分,它由客户端传递给享元对象,并且在享元对象之外维护。

享元模式的关键是使用共享对象来减少内存使用和提高性能。当需要创建新对象时,首先检查是否已经存在具有相同内部状态的对象,如果存在,则返回该对象的引用;如果不存在,则创建一个新对象并将其加入到共享池中,以便下次可以重复使用。

  1. #include <iostream>
  2. #include <map>
  3. #include <string>
  4. // 抽象享元类
  5. class Flyweight {
  6. public:
  7. virtual ~Flyweight() {}
  8. virtual void operation(const std::string& unique_state) const = 0;
  9. };
  10. // 具体享元类
  11. class ConcreteFlyweight : public Flyweight {
  12. public:
  13. ConcreteFlyweight(const std::string& shared_state) : shared_state_(shared_state) {}
  14. void operation(const std::string& unique_state) const override {
  15. std::cout << "ConcreteFlyweight: Shared state (" << shared_state_ << "), Unique state (" << unique_state << ")\n";
  16. }
  17. private:
  18. std::string shared_state_;
  19. };
  20. // 享元工厂类
  21. class FlyweightFactory {
  22. public:
  23. Flyweight* getFlyweight(const std::string& shared_state) {
  24. if (flyweights_.find(shared_state) == flyweights_.end()) {
  25. flyweights_[shared_state] = new ConcreteFlyweight(shared_state);
  26. }
  27. return flyweights_[shared_state];
  28. }
  29. ~FlyweightFactory() {
  30. for (auto it = flyweights_.begin(); it != flyweights_.end(); ++it) {
  31. delete it->second;
  32. }
  33. flyweights_.clear();
  34. }
  35. private:
  36. std::map<std::string, Flyweight*> flyweights_;
  37. };
  38. int main() {
  39. FlyweightFactory factory;
  40. Flyweight* flyweight1 = factory.getFlyweight("shared_state_1");
  41. flyweight1->operation("unique_state_1");
  42. Flyweight* flyweight2 = factory.getFlyweight("shared_state_2");
  43. flyweight2->operation("unique_state_2");
  44. Flyweight* flyweight3 = factory.getFlyweight("shared_state_1");
  45. flyweight3->operation("unique_state_3");
  46. return 0;
  47. }
  48. /*
  49. 在这个示例中,Flyweight 是抽象享元类,定义了操作接口 operation()。
  50. ConcreteFlyweight 是具体享元类,实现了抽象享元类的接口。
  51. FlyweightFactory 是享元工厂类,负责创建和管理享元对象。
  52. 在 main() 函数中,我们使用享元工厂来获取享元对象,并且重复使用了具有相同内部状态的对象。
  53. */

觉得有帮助的话,打赏一下呗。。

           

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

闽ICP备14008679号