【设计模式C#】享元模式(用于解决多次创建对象而导致的性能问题)
一种结构型设计模式。
特点是通过共享内部状态来减少对象的数量,从而降低内存使用和提高性能。
优点:
- 大幅减少对象的数量,减少了内存的使用,提高了性能;
- 支持更多颗粒度对象,而不会导致内存溢出;
- 可以与对象池技术结合,进一步提高对象池的复用效率。
缺点:
- 为了实现享元模式,需要将对象的状态分为内部状态和外部状态,提高了系统的复杂性;
- 享元对象被多个线程共享,可能会导致性能安全问题;
适用场景:
- 需要管理大量颗粒度对象;
- 对象大部分状态可以被共享;
- 共享对象时可以显著减少内存的使用;
- 外部状态可以通过客户端代码临时传入。
示例:
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();}
}