享元模式(Flyweight Pattern)是一种结构型设计模式,它的主要目的是用共享技术有效地支持大量细粒度的对象。
享元模式主要包含以下几个角色:
享元模式的主要优点是:
享元模式适用于以下场景:
以下是一个简单的C++实现的享元模式(Flyweight Pattern)示例:
#include
#include
// 抽象享元类
class Flyweight {
public:
virtual void operation(int extrinsicState) = 0;
virtual ~Flyweight() {}
};
// 具体享元类
class ConcreteFlyweight : public Flyweight {
public:
void operation(int extrinsicState) override {
std::cout << "Concrete Flyweight: " << extrinsicState << std::endl;
}
};
// 享元工厂类
class FlyweightFactory {
public:
Flyweight* getFlyweight(const std::string& key) {
if (flyweights.find(key) != flyweights.end()) {
return flyweights[key];
} else {
Flyweight* flyweight = new ConcreteFlyweight();
flyweights[key] = flyweight;
return flyweight;
}
}
private:
std::map<std::string, Flyweight*> flyweights;
};
int main() {
int extrinsicState = 22;
FlyweightFactory* factory = new FlyweightFactory();
Flyweight* fx = factory->getFlyweight("X");
fx->operation(--extrinsicState);
Flyweight* fy = factory->getFlyweight("Y");
fy->operation(--extrinsicState);
Flyweight* fz = factory->getFlyweight("Z");
fz->operation(--extrinsicState);
delete factory;
return 0;
}
在这个例子中,Flyweight是抽象享元类,定义了一个operation接口。ConcreteFlyweight是具体享元类,实现了operation接口。
FlyweightFactory是享元工厂类,它维护了一个对Flyweight对象的引用。当客户端请求一个Flyweight时,FlyweightFactory会检查是否已经创建了一个具有相同状态的Flyweight对象,如果有,就返回这个已经存在的对象,如果没有,就创建一个新的Flyweight对象。
通过这种方式,我们可以使得大量具有相同状态的对象共享同一个Flyweight对象,从而节省内存空间。