享元模式(Flyweight)
享元模式是一种结构型设计模式,用于减少创建大量小对象所带来的性能问题。它通过共享对象来支持大量的细粒度对象,从而减少内存消耗和提高性能。享元模式特别适用于大量相似对象的场景,例如在图形渲染、文本编辑器等应用中。
1. 享元模式的结构
享元模式包含以下几个主要组件:
- Flyweight(享元接口): 定义了具体享元对象所需的接口,用于支持共享的对象。
- ConcreteFlyweight(具体享元): 实现了 Flyweight接口,并且包含可以共享的状态。
- UnsharedConcreteFlyweight(非共享的具体享元): 不参与共享的享元对象,它可能包含非共享的状态。
- FlyweightFactory(享元工厂): 负责创建和管理享元对象,确保享元对象的共享。
2. Mermaid 关系图
以下是享元模式的类图,用 Mermaid 表示:
classDiagram
    class Flyweight {
        + operation(extrinsicState : int) : void
    }
    class ConcreteFlyweight {
        + operation(extrinsicState : int) : void
    }
    class UnsharedConcreteFlyweight {
        + operation(extrinsicState : int) : void
    }
    class FlyweightFactory {
        + getFlyweight(key : std::string) : Flyweight
    }
    Flyweight <|-- ConcreteFlyweight
    FlyweightFactory --> Flyweight : "管理"
    UnsharedConcreteFlyweight ..> Flyweight : "包含"
3. 享元模式的实现
Flyweight 享元接口:
class Flyweight {
public:
    virtual ~Flyweight() = default;
    virtual void operation(int extrinsicState) const = 0;
};
ConcreteFlyweight 具体享元类:
class ConcreteFlyweight : public Flyweight {
private:
    int intrinsicState;
public:
    ConcreteFlyweight(int state) : intrinsicState(state) {}
    void operation(int extrinsicState) const override {
        std::cout << "ConcreteFlyweight: intrinsicState = " << intrinsicState
                  << ", extrinsicState = " << extrinsicState << "\n";
    }
};
UnsharedConcreteFlyweight 非共享的具体享元类:
class UnsharedConcreteFlyweight : public Flyweight {
public:
    void operation(int extrinsicState) const override {
        std::cout << "UnsharedConcreteFlyweight: extrinsicState = " << extrinsicState << "\n";
    }
};
FlyweightFactory 享元工厂:
#include <map>
#include <memory>
class FlyweightFactory {
private:
    std::map<std::string, std::shared_ptr<Flyweight>> flyweights;
public:
    std::shared_ptr<Flyweight> getFlyweight(const std::string& key) {
        if (flyweights.find(key) == flyweights.end()) {
            flyweights[key] = std::make_shared<ConcreteFlyweight>(std::stoi(key));
        }
        return flyweights[key];
    }
};
Client 客户端代码:
int main() {
    FlyweightFactory factory;
    std::shared_ptr<Flyweight> flyweight1 = factory.getFlyweight("1");
    std::shared_ptr<Flyweight> flyweight2 = factory.getFlyweight("2");
    std::shared_ptr<Flyweight> flyweight3 = factory.getFlyweight("1"); // Should reuse the same instance as flyweight1
    flyweight1->operation(10);
    flyweight2->operation(20);
    flyweight3->operation(30); // Should have the same intrinsic state as flyweight1
    return 0;
}
4. 使用享元模式
在客户端代码中,通过享元工厂获取享元对象,享元工厂负责管理和共享享元对象。客户端可以使用这些享元对象,并通过它们来操作不同的外部状态。享元对象的共享机制有效减少了内存使用和对象创建开销。
5. 总结
享元模式通过共享对象来支持大量的细粒度对象,减少内存消耗和提高性能。Mermaid 类图展示了享元接口、具体享元类、非共享的具体享元类、享元工厂以及它们之间的关系,帮助理解模式的结构和实现。