大话设计模式之享元模式

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

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

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

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

// 抽象享元类
class Flyweight {
public:
    virtual ~Flyweight() {}
    virtual void operation(const std::string& unique_state) const = 0;
};

// 具体享元类
class ConcreteFlyweight : public Flyweight {
public:
    ConcreteFlyweight(const std::string& shared_state) : shared_state_(shared_state) {}

    void operation(const std::string& unique_state) const override {
        std::cout << "ConcreteFlyweight: Shared state (" << shared_state_ << "), Unique state (" << unique_state << ")\n";
    }

private:
    std::string shared_state_;
};

// 享元工厂类
class FlyweightFactory {
public:
    Flyweight* getFlyweight(const std::string& shared_state) {
        if (flyweights_.find(shared_state) == flyweights_.end()) {
            flyweights_[shared_state] = new ConcreteFlyweight(shared_state);
        }
        return flyweights_[shared_state];
    }

    ~FlyweightFactory() {
        for (auto it = flyweights_.begin(); it != flyweights_.end(); ++it) {
            delete it->second;
        }
        flyweights_.clear();
    }

private:
    std::map<std::string, Flyweight*> flyweights_;
};

int main() {
    FlyweightFactory factory;

    Flyweight* flyweight1 = factory.getFlyweight("shared_state_1");
    flyweight1->operation("unique_state_1");

    Flyweight* flyweight2 = factory.getFlyweight("shared_state_2");
    flyweight2->operation("unique_state_2");

    Flyweight* flyweight3 = factory.getFlyweight("shared_state_1");
    flyweight3->operation("unique_state_3");



    return 0;
}

/*
在这个示例中,Flyweight 是抽象享元类,定义了操作接口 operation()。
ConcreteFlyweight 是具体享元类,实现了抽象享元类的接口。
FlyweightFactory 是享元工厂类,负责创建和管理享元对象。

在 main() 函数中,我们使用享元工厂来获取享元对象,并且重复使用了具有相同内部状态的对象。

*/

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

           

相关推荐

  1. 【前端设计模式模式

    2024-04-21 05:14:04       64 阅读
  2. 设计模式模式 -- C++】

    2024-04-21 05:14:04       28 阅读
  3. 设计模式模式

    2024-04-21 05:14:04       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-21 05:14:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-21 05:14:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-21 05:14:04       82 阅读
  4. Python语言-面向对象

    2024-04-21 05:14:04       91 阅读

热门阅读

  1. linux nohup命令启动jar包 如何取消nohup日志打印

    2024-04-21 05:14:04       46 阅读
  2. C语言实现单链表

    2024-04-21 05:14:04       39 阅读
  3. XiaodiSec day011 Learn Note 小迪渗透学习笔记

    2024-04-21 05:14:04       37 阅读
  4. ChatGPT引领:打造独具魅力的论文

    2024-04-21 05:14:04       44 阅读
  5. MySQL怎么排查慢sql语句,排查后一般怎么优化

    2024-04-21 05:14:04       36 阅读
  6. 24五一杯正在准备中

    2024-04-21 05:14:04       30 阅读
  7. (自学用)传统反演思路

    2024-04-21 05:14:04       33 阅读