6、跟学23种设计模式(C++版):享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,旨在减少应用程序中对象的数量,以节省内存和提高性能。它通过共享尽可能多的数据来减少内存占用,这种共享通常是通过将内在状态从对象中移出并放入共享存储来实现的。

特点

  • 共享对象:享元模式通过共享细粒度对象来减少内存消耗。通常会有一个享元工厂来管理这些共享对象的创建和存储。
  • 内在状态和外在状态:享元模式将对象的状态分为内在状态和外在状态。内在状态是共享的,不会随环境变化;外在状态是不共享的,随环境变化。
  • 延迟加载:在需要时才创建共享对象,从而进一步减少内存使用。

适用场景

  • 减少内存开销。当应用程序中存在大量相似对象时,可以使用享元模式来减少内存消耗。
  • 当对象的大部分状态可以变为外部状态,并且可以相对独立地加以修改时。
  • 当使用对象的代价高昂,而通过共享可以显著降低该代价时。

案例演示

我们以一个简单的图形绘制程序为例,其中有不同颜色的圆。使用享元模式,我们可以共享相同颜色的圆对象,而不是为每个圆创建一个新的对象。

#include <iostream>
#include <string>
#include <unordered_map>

// 享元对象接口
class Shape {
public:
    virtual void draw(int x, int y) = 0;
    virtual ~Shape() = default;
};

// 具体享元类:圆
class Circle : public Shape {
private:
    std::string color;
    int radius;
public:
    Circle(const std::string& color) : color(color), radius(5) {}

    void draw(int x, int y) override {
        std::cout << "Drawing a " << color << " circle at (" << x << ", " << y << ")" << std::endl;
    }
};

// 享元工厂类
class ShapeFactory {
private:
    std::unordered_map<std::string, Circle*> circleMap;
public:
    ~ShapeFactory() {
        for (auto& pair : circleMap) {
            delete pair.second;
        }
    }

    Circle* getCircle(const std::string& color) {
        if (circleMap.find(color) == circleMap.end()) {
            circleMap[color] = new Circle(color);
            std::cout << "Creating a circle of color: " << color << std::endl;
        }
        return circleMap[color];
    }
};

// 客户端代码
int main() {
    ShapeFactory* factory = new ShapeFactory();

    Shape* redCircle1 = factory->getCircle("Red");
    redCircle1->draw(10, 10);

    Shape* redCircle2 = factory->getCircle("Red");
    redCircle2->draw(20, 20);

    Shape* blueCircle = factory->getCircle("Blue");
    blueCircle->draw(30, 30);

    delete factory;
    return 0;
}

案例说明

Shape:定义了绘制方法的接口。

1、 Circle:实现了Shape接口,并包含了颜色和半径属性;
2、 ShapeFactory:管理Circle对象的创建和缓存,通过getCircle方法返回共享的Circle对象;
3、 客户端代码:通过ShapeFactory获取共享的Circle对象,并调用其draw方法进行绘制;

*

总结

享元模式通过共享相同的对象来减少内存消耗,适用于大量相似对象的场景。其核心思想是将对象的内在状态进行共享,而外在状态则由客户端来维护。通过享元模式,可以显著提高应用程序的性能并减少内存占用。

END

今天是日更的第11/100天

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: