【设计模式&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();
    }
}
相关推荐
唐青枫7 小时前
别只会反射:C#.NET Emit 动态生成代码实战详解
c#·.net
咕白m62511 小时前
.NET 环境下 Word 超链接批量提取方案
c#·.net
用户917215619021111 小时前
C# 通信协议增量解析:用状态机处理半包和粘包
c#
小码编匠1 天前
C# 工控上位机必备:数据转换工具类与十个核心模块
后端·c#·.net
槑有老呆1 天前
别再手搓 Prompt 了,那个叫"手动挡循环"
设计模式
用户6919026813392 天前
Vibe Coding 开发项目的基本范式
人工智能·设计模式·代码规范
怕浪猫3 天前
领域特定语言(Domain-Specific Language, DSL)
设计模式·程序员·架构
唐青枫3 天前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
Artech4 天前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf