【设计模式&C#】享元模式(用于解决多次创建对象而导致的性能问题)

一种结构型设计模式。

特点是通过共享内部状态来减少对象的数量,从而降低内存使用和提高性能。

优点:

  1. 大幅减少对象的数量,减少了内存的使用,提高了性能;
  2. 支持更多颗粒度对象,而不会导致内存溢出;
  3. 可以与对象池技术结合,进一步提高对象池的复用效率。

缺点:

  1. 为了实现享元模式,需要将对象的状态分为内部状态和外部状态,提高了系统的复杂性;
  2. 享元对象被多个线程共享,可能会导致性能安全问题;

适用场景:

  1. 需要管理大量颗粒度对象;
  2. 对象大部分状态可以被共享;
  3. 共享对象时可以显著减少内存的使用;
  4. 外部状态可以通过客户端代码临时传入。

示例:

cs 复制代码
public abstract class MoTor
{   
    //内部状态
    public string color;

    public MoTor(string color)
    {
        this.color = color;
    }

    /// <summary>
    /// 外部状态方法,account属于账号(外部状态)
    /// </summary>
    /// <param name="account"></param>
    public abstract void GetMoTor(int account);
}
cs 复制代码
public class MTMoTor : MoTor
{   
    public MTMoTor(string color): base(color)
    {

    }

    public override void GetMoTor(int account)
    {
        Debug.Log("用户" + account + "获取了一辆颜色为:" + color + "的MTMoTor");
    }
}
cs 复制代码
public class OPMoTor : MoTor
{   
    public OPMoTor(string color): base(color)
    {

    }

    public override void GetMoTor(int account)
    {
        Debug.Log("用户" + account + "获取了一辆颜色为:" + color + "的OPMoTor");
    }
}
cs 复制代码
/// <summary>
/// 享元模式工厂
/// </summary>
public class MoTorFlyWeightFactory
{   
    //motor示例管理容器
    private Dictionary<string, MoTor> motorMaps = new Dictionary<string, MoTor>();

    public MoTor GetMotor(string color, MoTorType moTorType)
    {   
        string key = color + "_" + moTorType.ToString();

        if (motorMaps.ContainsKey(key))
        {
            return motorMaps[key];
        }    
        else
        {
            MoTor moTor = null;

            switch (moTorType)
            {
                case MoTorType.MTMoTor:
                    moTor = new MTMoTor(color);
                    break;
                case MoTorType.OPMoTor:
                    moTor = new OPMoTor(color);
                    break;
                default:
                    Debug.Log("目前没有这种车型");
                    return null;
            }

            motorMaps[key] = moTor;

            return moTor;
        }
    }

    public void SearchMaps()
    {
        foreach(string key in motorMaps.Keys)
        {
            Debug.Log(key);
        }
    }
}
cs 复制代码
public enum MoTorType
{
    MTMoTor,
    OPMoTor,
}
cs 复制代码
public class Client
{
    public static void Main(string[] args)
    {
        MoTorFlyWeightFactory moTorFlyWeightFactory = new();

        MoTor mtMotor = moTorFlyWeightFactory.GetMotor("blue", MoTorType.MTMoTor);//生成成功 然后获取到
        MoTor opMotor = moTorFlyWeightFactory.GetMotor("red", MoTorType.OPMoTor);//生成成功,然后获取到

        if(mtMotor != null)
        {
            mtMotor.GetMoTor(111000);//账号111000获取了颜色为blue的MTMoTor
        } 
        if(opMotor != null)
        {
            opMotor.GetMoTor(12345);//账号12345获取了颜色为red的OPMoTor
        }
        
        //遍历实例化容器
        moTorFlyWeightFactory.SearchMaps();
    }
}
相关推荐
云天徽上9 小时前
【数据可视化-106】华为2025上半年财报分析:用Python和Pyecharts打造炫酷可视化大屏
开发语言·python·华为·信息可视化·数据分析·pyecharts
尘鹄12 小时前
go 初始化组件最佳实践
后端·设计模式·golang
墩墩分墩12 小时前
【Go语言入门教程】 Go语言的起源与技术特点:从诞生到现代编程利器(一)
开发语言·后端·golang·go
CHANG_THE_WORLD12 小时前
并发编程指南 同步操作与强制排序
开发语言·c++·算法
仰泳之鹅13 小时前
【C语言】深入理解指针(5)
c语言·开发语言
无为之士14 小时前
君正交叉编译链工具mips-gcc540-glibc222-64bit-r3.3.0.smaller.bz2编译st-device-sdk-c
c语言·开发语言
源力祁老师15 小时前
深入分析 json2(新)与标准的 jsonrpc的区别
开发语言
小wanga15 小时前
C++知识
java·开发语言·c++
学渣6765615 小时前
文件传输工具rsync|rust开发环境安装|Ascend实验相关命令
开发语言·后端·rust