您现在的位置是:首页 > 编程 > 

享元模式详解

2025-07-27 20:09:23
享元模式详解 享元模式(Flyweight Pattern)详解定义享元模式是一种结构型设计模式,旨在通过共享对象来尽量减少内存的使用。享元模式通过将重复使用的对象分离成共享和非共享部分,达到复用的目的,从而有效节省内存。核心概念角组成 享元(Flyweight) 定义共享对象的接口,并可以提供内部状态(共享部分)和外部状态(非共享部分)的管理方法。 具体享元(Concrete Flywe

享元模式详解

享元模式(Flyweight Pattern)详解

定义

享元模式是一种结构型设计模式,旨在通过共享对象来尽量减少内存的使用。享元模式通过将重复使用的对象分离成共享和非共享部分,达到复用的目的,从而有效节省内存。


核心概念

角组成
  1. 享元(Flyweight) 定义共享对象的接口,并可以提供内部状态(共享部分)和外部状态(非共享部分)的管理方法。
  2. 具体享元(Concrete Flyweight) 实现享元接口,并实现共享部分的存储与管理。
  3. 享元工厂(FlyweightFactory) 管理享元对象的创建与复用。确保享元对象被正确地共享和管理。
  4. 非共享享元(Unshared Concrete Flyweight) 不共享的部分,用来存储具体的、每个对象独立的状态。

享元模式的类图


使用场景

  1. 大量对象的重复创建:当系统中存在大量相似对象,并且这些对象占用大量内存时,适合使用享元模式。
  2. 对象之间的共享性较强:当对象的某些部分是可以共享的(比如图形的颜、字符的字体),而某些部分是特有的(如对象的位置、大小等),使用享元模式可以显著降低内存消耗。
  3. 提高性能和内存使用效率:通过共享相同状态,减少内存占用,提高程序性能。

优缺点分析

优点
  1. 节省内存:通过共享相同的对象,避免了内存的浪费。
  2. 提高性能:避免了重复创建相同的对象,提高了性能。
  3. 易于扩展:新的享元对象可以根据需要加入,而不影响现有的系统。
缺点
  1. 复杂性增加:享元模式通过共享和非共享的状态分离,使得系统结构变得更加复杂。
  2. 不能共享所有状态:不是所有的对象都能通过享元模式来共享,对于某些状态的对象可能无法进行共享。

使用案例

案例 1:文本编辑器
  • 描述:在文本编辑器中,每个字符都可以有不同的字体、大小和颜,但大部分字符会使用相同的字体和颜。通过享元模式,可以将这些重复的字符样式对象进行共享,以节省内存。
  • 实现:字体、颜等属性作为共享部分,字符内容作为非共享部分。
案例 2:图形系统
  • 描述:在绘图应用中,多个相同类型的图形(如矩形、圆形)可能具有相同的属性(如颜、填充等)。通过享元模式,可以将这些相同的属性提取为共享对象,只为每个图形的唯一位置和尺寸分配独立对象。
  • 实现:图形的形状作为共享部分,位置和尺寸作为非共享部分。

知识点对比表

特性

享元模式

不使用享元模式

对象创建方式

共享和复用相同的对象

每次创建新的对象

内存使用

节省内存,避免重复对象

内存使用较多,可能浪费空间

复杂度

需要享元工厂和状态管理

结构简单

使用场景

对象共享性强,内存紧张时

对象间差异较大时,适合直接创建

C++ 实现

代码语言:javascript代码运行次数:0运行复制
#include <iostream>
#include <unordered_map>
#include <memory>
using namespace std;

// 享元接口
class Flyweight {
public:
    virtual void operation(ct string& extrinsicState) ct = 0;
    virtual ~Flyweight() = default;
};

// 具体享元
class ConcreteFlyweight : public Flyweight {
private:
    string intrinsicState; // 共享状态

public:
    explicit ConcreteFlyweight(string state) : intrinsicState(move(state)) {}

    void operation(ct string& extrinsicState) ct override {
        cout << "Intrinsic state: " << intrinsicState << ", Extrinsic state: " << extrinsicState << endl;
    }
};

// 享元工厂
class FlyweightFactory {
private:
    unordered_map<string, shared_ptr<Flyweight>> flyweights;

public:
    shared_ptr<Flyweight> getFlyweight(ct string& key) {
        if (flyweights.find(key) == ()) {
            flyweights[key] = make_shared<ConcreteFlyweight>(key);
        }
        return flyweights[key];
    }
};

// 客户端代码
int main() {
    FlyweightFactory factory;
    shared_ptr<Flyweight> f1 = factory.getFlyweight("SharedState1");
    shared_ptr<Flyweight> f2 = factory.getFlyweight("SharedState1");
    shared_ptr<Flyweight> f = factory.getFlyweight("SharedState2");

    f1->operation("UniqueState1");
    f2->operation("UniqueState2");
    f->operation("UniqueState");

    return 0;
}

C# 实现

代码语言:javascript代码运行次数:0运行复制
using System;
using System.Collecti.Generic;

// 享元接口
public abstract class Flyweight {
    public abstract void Operation(string extrinsicState);
}

// 具体享元
public class ConcreteFlyweight : Flyweight {
    private string intrinsicState; // 共享状态

    public ConcreteFlyweight(string state) {
        intrinsicState = state;
    }

    public override void Operation(string extrinsicState) {
        Cole.WriteLine($"Intrinsic state: {intrinsicState}, Extrinsic state: {extrinsicState}");
    }
}

// 享元工厂
public class FlyweightFactory {
    private Dictionary<string, Flyweight> flyweights = new Dictionary<string, Flyweight>();

    public Flyweight GetFlyweight(string key) {
        if (!flyweights.ContainsKey(key)) {
            flyweights[key] = new ConcreteFlyweight(key);
        }
        return flyweights[key];
    }
}

// 客户端代码
class Program {
    static void Main() {
        FlyweightFactory factory = new FlyweightFactory();
        Flyweight f1 = factory.GetFlyweight("SharedState1");
        Flyweight f2 = factory.GetFlyweight("SharedState1");
        Flyweight f = factory.GetFlyweight("SharedState2");

        f1.Operation("UniqueState1");
        f2.Operation("UniqueState2");
        f.Operation("UniqueState");
    }
}

总结

  1. 内存优化:享元模式通过共享对象,显著减少内存占用。
  2. 高效的对象管理:通过享元工厂管理共享对象的生命周期,避免不必要的对象创建。
  3. 适用场景:大量相似对象的场景,尤其是在需要节省内存时。

欢迎关注、点赞、收藏!更多系列内容可以点击专栏目录订阅,感谢支持,再次祝大家祉猷并茂,顺遂无虞

若将文章用作它处,请一定注明出处,商用请私信联系我!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-12-12,如有侵权请联系 cloudcommunity@tencent 删除管理接口内存性能对象

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1238965.html

相关标签:无
上传时间: 2025-07-26 20:27:26
留言与评论(共有 14 条评论)
本站网友 海通同花顺
26分钟前 发表
intrinsicState(move(state)) {} void operation(ct string& extrinsicState) ct override { cout << "Intrinsic state
本站网友 报考监理员的条件
8分钟前 发表
但大部分字符会使用相同的字体和颜
本站网友 中浩青溪庄园
14分钟前 发表
Flyweight>(); public Flyweight GetFlyweight(string key) { if (!flyweights.ContainsKey(key)) { flyweights[key] = new ConcreteFlyweight(key); } return flyweights[key]; } } // 客户端代码 class Program { static void Main() { FlyweightFactory factory = new FlyweightFactory(); Flyweight f1 = factory.GetFlyweight("SharedState1"); Flyweight f2 = factory.GetFlyweight("SharedState1"); Flyweight f = factory.GetFlyweight("SharedState2"); f1.Operation("UniqueState1"); f2.Operation("UniqueState2"); f.Operation("UniqueState"); } }总结内存优化:享元模式通过共享对象
本站网友 蔡福
20分钟前 发表
只为每个图形的唯一位置和尺寸分配独立对象
本站网友 河南省教育学院
13分钟前 发表
并且这些对象占用大量内存时
本站网友 杭州市一医院
11分钟前 发表
旨在通过共享对象来尽量减少内存的使用
本站网友 广州淘金路
29分钟前 发表
virtual void operation(ct string& extrinsicState) ct = 0; virtual ~Flyweight() = default; }; // 具体享元 class ConcreteFlyweight
本站网友 跟我学做纸艺花
7分钟前 发表
shared_ptr<Flyweight>> flyweights; public
本站网友 吃槟榔的好处
30分钟前 发表
具体享元(Concrete Flyweight) 实现享元接口
本站网友 云南旅游图
23分钟前 发表
提高性能和内存使用效率:通过共享相同状态
本站网友 泰铢和人民币汇率
28分钟前 发表
提高性能和内存使用效率:通过共享相同状态
本站网友 宁波洗浴中心
0秒前 发表
如有侵权请联系 cloudcommunity@tencent 删除前往查看管理接口内存性能对象
本站网友 联合证券
24分钟前 发表
内存紧张时对象间差异较大时