享元模式
- 不常用
定义
享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在减少对象的数量,从而降低内存和性能消耗。享元模式的核心思想是共享相同状态的多个对象,而不是为每个对象都分配独立的内存。
角色
享元模式包括以下几个关键角色:
- 享元工厂(Flyweight Factory):享元工厂是一个类,它负责创建、获取和存储享元对象。提供获取享元对象的方法,当请求某个享元对象时,工厂类首先检查集合中是否存在该对象,如果存在则直接返回,否则创建新的享元对象并添加到集合中。它通常包括一个池(或缓存),用于存储已创建的享元对象,以便在需要时共享它们。
- 抽象享元(Flyweight):享元是一个接口或抽象类,它定义了享元对象的接口。这个接口应该包括操作享元对象内部状态的方法,以及可能设置或获取外部状态的方法。不包括内部状态和外部状态,仅定义了一个通用的接口。
- 具体享元(Concrete Flyweight):具体享元是实现享元接口的具体类,它包含了内部状态,这些内部状态在多个享元实例之间是共享的。并根据外部状态进行相应的操作。
- 客户端(Client):客户端是使用享元模式的应用程序的一部分。客户端通常负责维护外部状态,并在需要时从享元工厂获取共享的享元对象,而不是直接创建享元对象。
示例代码1
#include <iostream>
#include <map>
// 享元接口 - 图形
class Shape {
public:
virtual void draw(const std::string& color) = 0;
};
// 具体享元 - 圆形
class Circle : public Shape {
public:
Circle() : radius_(0) {}
void setRadius(int radius) {
radius_ = radius;
}
void draw(const std::string& color) override {
std::cout << "Drawing a " << color << " circle with radius " << radius_ << "." << std::endl;
}
private:
int radius_;//共享状态
// 这里可以添加更多的共享状态
};
// 享元工厂 - 管理并共享享元对象
class ShapeFactory {
public:
Shape* getCircle(const std::string& color) {
if (circles_.find(color) == circles_.end()) {
// 如果不存在指定颜色的圆形对象,则创建一个新的并存储在池中
Circle* circle = new Circle();
circle->draw(color);
circles_[color] = circle;
}
return circles_[color];
}
private:
std::map<std::string, Shape*> circles_;
};
int main() {
ShapeFactory factory;
// 获取并绘制不同颜色的圆形
Shape* redCircle = factory.getCircle("Red");
Shape* greenCircle = factory.getCircle("Green");
Shape* blueCircle = factory.getCircle("Blue");
// 再次获取相同颜色的圆形,实际上是共享了已存在的对象
Shape* redCircle2 = factory.getCircle("Red");
Shape* greenCircle2 = factory.getCircle("Green");
Shape* blueCircle2 = factory.getCircle("Blue");
// 手动设置圆形的半径
dynamic_cast<Circle*>(redCircle)->setRadius(5);
dynamic_cast<Circle*>(greenCircle)->setRadius(10);
dynamic_cast<Circle*>(blueCircle)->setRadius(8);
redCircle2->draw("Red"); // 共享的圆形,半径为5
greenCircle2->draw("Green");// 共享的圆形,半径为10
blueCircle2->draw("Blue"); // 共享的圆形,半径为8
return 0;
}
在上述示例中,Shape
是享元接口,Circle
是具体享元,ShapeFactory
是享元工厂。当客户端请求创建一个圆形对象时,ShapeFactory
首先检查是否已经存在具有相同颜色的圆形对象。如果是,它将返回共享的对象,否则将创建一个新的对象并存储在池中。
通过享元模式,我们可以共享相同颜色的圆形对象,从而减少内存消耗。这在需要大量相似对象的场景中非常有用,例如图形绘制和游戏开发中的粒子系统。