小工具知识网

当前位置: 首页 > 行业知识 > C++设计模式之——享元模式详解和代码案例

行业知识

C++设计模式之——享元模式详解和代码案例

2026-10-31 20:26:48 来源:互联网转载

文章目录

    • C++中实现享元模式通常涉及以下几个关键部分:
    • 一个简单的C++代码片段示例
    • 享元模式的进一步说明
    • C++享元模式代码案例——咖啡店订单系统
    • 享元���式在现实世界的应用场景

      C++中实现享元模式通常涉及以下几个关键部分:

      享元模式(Flyweight Pattern)是一种用于性能优化的设计模式,它通过共享对象来有效支持大量的细粒度对象,以减少内存消耗。这种模式适用于那些对象中大部分状态可以外部化,而只有少量内部状态(不随环境改变而改变的状态)的对象。在C++中实现享元模式通常涉及以下几个关键部分:

      1. 抽象享元(Flyweight Interface):

        定义了所有具体享元类共有的接口,通常包含内部状态和外部状态的操作方法。内部状态是可以共享的,而外部状态由客户端在每次调用时传入。

      class IFlyweight {public:    virtual ~IFlyweight() {}    // 内部状态不变的操作    virtual void operation(const Context& context) const = 0;};
      1. 具体享元(Concrete Flyweight):

        实现了抽象享元接口,并存储内部状态。具体享元类的实例是可共享的。

      class ConcreteFlyweight : public IFlyweight {private:    std::string intrinsicState; // 内部状态public:    ConcreteFlyweight(const std::string& state) : intrinsicState(state) {}    void operation(const Context& context) const override {        // 使用内部状态和外部状态进行操作    }};
      1. 享元工厂(Flyweight Factory):

        负责创建和管理享元对象。它确保当请求的是相同的内部状态时,不会创建多个具有相同内部状态的享元对象。

      class FlyweightFactory {private:    std::map flyweights;public:    std::shared_ptr getFlyweight(const std::string& key) {        if (flyweights.find(key) == flyweights.end()) {            flyweights[key] = std::make_shared(key);        }        return flyweights[key];    }};

      一个简单的C++代码片段示例

      下面是一个简单的C++代码片段示例,展示了如何使用享元模式:

      #include #include #include #include // 抽象享元class IFlyweight {public:    virtual ~IFlyweight() {}    virtual void operation(const std::string& extrinsicState) const = 0;};// 具体享元class ConcreteFlyweight : public IFlyweight {private:    std::string intrinsicState;public:    ConcreteFlyweight(const std::string& state) : intrinsicState(state) {}    void operation(const std::string& extrinsicState) const override {        std::cout private:    std::map        if (flyweights.count(key) == 0) {            flyweights[key] = std::make_shared    FlyweightFactory factory;    std::vector"state1", "state2", "state2"};    for (const auto& state : extrinsicStates) {        auto flyweight = factory.getFlyweight("sharedState");        flyweight-operation(state);    }    return 0;}private:    Texture texture; // 内部状态,表示字符图像纹理public:    CharacterFlyweight(const Texture& tex) : texture(tex) {}    void operation(const RenderingContext& context) const override {        // 使用共享的纹理资源,根据context中的位置、旋转角度等绘制字符    }};class CharacterFactory {private:    std::map        if (characters.find(style) == characters.end()) {            Texture tex = loadTexture(style.getFontFile()); // 加载图片资源            characters[style] = std::make_shared    Point position;    double rotation;    float scale;    // 其他外部状态...};int main() {    CharacterFactory factory;    // 渲染不同位置的同一种字符    CharacterStyle sharedStyle("Arial.ttf");    RenderingContext ctx1{Point{10, 20}, 0.0, 1.0};    RenderingContext ctx2{Point{30, 40}, 0.0, 1.0};    auto character = factory.getCharacter(sharedStyle);    character-operation(ctx1);    character-operation(ctx2);    return 0;}public:    virtual ~CoffeeFlavor() {}    virtual void serve() const = 0;};// 具体享元类class ConcreteCoffeeFlavor : public CoffeeFlavor {public:    explicit ConcreteCoffeeFlavor(const std::string& flavorName)        : flavorName_(flavorName) {}    void serve() const override {        std::cout private:    std::map        if (flavors.find(flavor) == flavors.end()) {            flavors[flavor] = std::make_shared    CoffeeFlavorFactory factory;    // 创建几个不同的订单,但某些口味会被共享    std::vector"Espresso", "Latte", "Espresso", "Cappuccino", "Espresso"};    for (const auto& order : orders) {        auto flavor = factory.getOrder(order);        flavor-serve();    }    return 0;}public:    virtual ~CoffeeFlavor() {}    virtual void serve(const std::string& extras, const std::string& size) const = 0;};// 具体享元类class ConcreteCoffeeFlavor : public CoffeeFlavor {public:    explicit ConcreteCoffeeFlavor(const std::string& flavorName)        : flavorName_(flavorName) {}    void serve(const std::string& extras, const std::string& size) const override {        std::cout private:    std::map        if (flavors.find(flavor) == flavors.end()) {            flavors[flavor] = std::make_sharedpublic:    CoffeeOrder(std::shared_ptr}    void serve() const {        flavor_-serve(extras_, size_);    }private:    std::shared_ptr    CoffeeFlavorFactory factory;    // 创建几个不同的订单,但某些口味会被共享    std::vector        {factory.getOrder("Espresso"), "no sugar", "small"},        {factory.getOrder("Latte"), "extra foam", "medium"},        {factory.getOrder("Espresso"), "double sugar", "large"},        {factory.getOrder("Cappuccino"), "cinnamon", "medium"},        {factory.getOrder("Espresso"), "single sugar", "small"}    };    for (const auto& order : orders) {        order.serve();    }    return 0;}

上一篇:怎么加入柯南朋友的服务器

下一篇:暗黑3怎么更换服务器?