享元模式(C++)

**定义:**享元模式是一种结构型设计模式,它使用共享对象,用以尽可能减少内存使用和提高性能。享元模式通过共享已经存在的对象实例,而不是每次需要时都创建新对象实例,从而避免大量重复对象的开销。

对比:

单例模式对比:两者都限制了对象的创建,不同之处在于单例模式全局只有一个实例,而享元模式会在状态相同时共享同一个实例。

原型模式对比:虽然原型模式不涉及状态的共享,但通过现有对象来创建一个新对象,达到了新对象和原对象"内容"上的一致。在实现原型模式时,根据场景也可以使用享元模式来优化对象的存储和创建过程。

代码:

cpp 复制代码
// 抽象享元角色
class Flyweight {
public:
    virtual ~Flyweight() = default;
    virtual void display(const std::string& extrinsicState) = 0; // 外在状态作为参数传递
};

// 具体享元角色
class ConcreteFlyweight : public Flyweight {
private:
    char intrinsicState; // 内在状态
public:
    ConcreteFlyweight(char state) : intrinsicState(state) {}
    void display(const std::string& extrinsicState) override {
        std::cout << "Intrinsic State: " << intrinsicState << ", Extrinsic State: " << extrinsicState << std::endl;
    }
};

// 享元工厂角色
class FlyweightFactory {
private:
    std::unordered_map<char, std::shared_ptr<Flyweight>> flyweights;
public:
    std::shared_ptr<Flyweight> getFlyweight(char key) {
        if (flyweights.find(key) == flyweights.end()) {
            flyweights[key] = std::make_shared<ConcreteFlyweight>(key);
        }
        return flyweights[key];
    }
};

// 客户端角色
class Client {
private:
    std::shared_ptr<FlyweightFactory> factory;
public:
    Client(std::shared_ptr<FlyweightFactory> f) : factory(f) {}
    void execute(char key, const std::string& extrinsicState) {
        std::shared_ptr<Flyweight> flyweight = factory->getFlyweight(key);
        flyweight->display(extrinsicState);
    }
};

int main() {
    std::shared_ptr<FlyweightFactory> factory = std::make_shared<FlyweightFactory>();
    Client client(factory);

    client.execute('A', "Position (10, 20)");
    client.execute('B', "Position (15, 25)");
    client.execute('A', "Position (20, 30)"); // 'A' 是共享的,所以使用相同的实例

    return 0;
}
相关推荐
神仙别闹1 小时前
基于 C++ 实现(控制台)学生成绩管理系统
开发语言·c++
会周易的程序员1 小时前
5 节点边缘冗余方案(上):基于 aiRaft 的物联网高可用控制面设计
c++·分布式·物联网·raft·iot·共识
伞伞悦读2 小时前
【第36期】Python 目录与路径详解:pathlib、文件遍历、创建、复制、移动和删除风险
开发语言·python
qq_199886874 小时前
第6板块·第4节:构建系统与多文件项目
c++·人工智能·gpu算力
2601_966949655 小时前
只拿到股票代码还不够:量化程序到底还需要哪些标的信息?——从数据建模开始理解股票元数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
m0_734571765 小时前
深入理解5g <十八>传输块tbsize的计算
开发语言·5g
汉克老师6 小时前
GESP2026年9月认证C++三级( 第三部分编程题(2、分割字符串))精讲
c++·gesp·小学生·学c++编程
估值探索者6 小时前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘
RAN11426760086 小时前
1.3第一个程序的介绍
开发语言·qt
天若有情6736 小时前
C++花式魔改!手写头文件复刻Java语法,彻底打破编码思维定式
java·c++·语言做语言·jac++