**定义:**享元模式是一种结构型设计模式,它使用共享对象,用以尽可能减少内存使用和提高性能。享元模式通过共享已经存在的对象实例,而不是每次需要时都创建新对象实例,从而避免大量重复对象的开销。
对比:
与单例模式对比:两者都限制了对象的创建,不同之处在于单例模式全局只有一个实例,而享元模式会在状态相同时共享同一个实例。
与原型模式对比:虽然原型模式不涉及状态的共享,但通过现有对象来创建一个新对象,达到了新对象和原对象"内容"上的一致。在实现原型模式时,根据场景也可以使用享元模式来优化对象的存储和创建过程。
代码:
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;
}