享元 模式

享元模式

  • 不常用

定义

享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在减少对象的数量,从而降低内存和性能消耗。享元模式的核心思想是共享相同状态的多个对象,而不是为每个对象都分配独立的内存。

角色

享元模式包括以下几个关键角色:

  1. 享元工厂(Flyweight Factory):享元工厂是一个类,它负责创建、获取存储享元对象。提供获取享元对象的方法,当请求某个享元对象时,工厂类首先检查集合中是否存在该对象,如果存在则直接返回,否则创建新的享元对象并添加到集合中。它通常包括一个池(或缓存),用于存储已创建的享元对象,以便在需要时共享它们。
  2. 抽象享元(Flyweight):享元是一个接口或抽象类,它定义了享元对象的接口。这个接口应该包括操作享元对象内部状态的方法,以及可能设置或获取外部状态的方法不包括内部状态外部状态,仅定义了一个通用的接口。
  3. 具体享元(Concrete Flyweight):具体享元是实现享元接口的具体类,它包含了内部状态,这些内部状态在多个享元实例之间是共享的。并根据外部状态进行相应的操作。
  4. 客户端(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 首先检查是否已经存在具有相同颜色的圆形对象。如果是,它将返回共享的对象,否则将创建一个新的对象并存储在池中。

通过享元模式,我们可以共享相同颜色的圆形对象,从而减少内存消耗。这在需要大量相似对象的场景中非常有用,例如图形绘制和游戏开发中的粒子系统。

原文链接:https://zhuanlan.zhihu.com/p/658041610

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值