【设计模式&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();
    }
}
相关推荐
ray9636 分钟前
Python——函数参数传递方式
开发语言·python
helloworddm6 分钟前
防止应用多开-WPF
服务器·架构·c#
BullSmall7 分钟前
Socket中断原因与处理全攻略
开发语言
十五年专注C++开发7 分钟前
浅谈Qt中的QSql模块整体设计
开发语言·数据库·c++·qt
梅羽落12 分钟前
python武器化开发_01
开发语言·python·php
Joe_Blue_0216 分钟前
Matlab 入门案例介绍——如何创建脚本
开发语言·matlab·matlab 入门案例
我是唐青枫17 分钟前
深入理解 Parallel.ForEachAsync:C#.NET 并行调度模型揭秘
c#·.net
崇山峻岭之间24 分钟前
Matlab学习记录20
开发语言·学习·matlab
逍遥德27 分钟前
JPA 操作对象图 (Object Graph) 详解
开发语言·python
微爱帮监所写信寄信32 分钟前
微爱帮监狱寄信写信小程序信件内容实时保存技术方案
java·服务器·开发语言·前端·小程序