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