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

发布于:2025-07-21 ⋅ 阅读:(17) ⋅ 点赞:(0)

一种结构型设计模式。

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

优点:

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

缺点:

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

适用场景:

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

示例:

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);
}
public class MTMoTor : MoTor
{   
    public MTMoTor(string color): base(color)
    {

    }

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

    }

    public override void GetMoTor(int account)
    {
        Debug.Log("用户" + account + "获取了一辆颜色为:" + color + "的OPMoTor");
    }
}
/// <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);
        }
    }
}
public enum MoTorType
{
    MTMoTor,
    OPMoTor,
}
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();
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到