当前位置: 首页 > news >正文

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

一种结构型设计模式。

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

优点:

  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();}
}
http://www.xdnf.cn/news/1159219.html

相关文章:

  • TypeScript 中替代 Interface 的方案
  • 17.TaskExecutor与ResourceManager交互
  • 对粒子群算法的理解与实例详解
  • 系统思考:整体论
  • 5.2.4 指令执行过程
  • 基于FPGA的多级流水线加法器verilog实现,包含testbench测试文件
  • Muon小记
  • 【unitrix】 6.9 减一操作(sub_one.rs)
  • 数据结构与算法汇总
  • Twisted study notes[2]
  • Node.js worker_threads 性能提升
  • ARM 学习笔记(三)
  • C 语言经典编程题实战:从基础算法到趣味问题全解析
  • python学智能算法(二十六)|SVM-拉格朗日函数构造
  • Beamer-LaTeX学习(教程批注版)【6】
  • AtCoder Beginner Contest 415
  • Linux系统中全名、用户名、主机名的区别
  • Unity学习笔记(五)——3DRPG游戏(2)
  • 《拆解WebRTC:NAT穿透的探测逻辑与中继方案》
  • (苍穹外卖)暑假学习理解P2
  • 平安车管家|中国平安车管家入职测评16PF瑞文IQ测评答题攻略及真题题库
  • UDP中的单播,多播,广播(代码实现)
  • securecrt连接服务器报错 Key exchange failed 怎么办
  • 在服务器无网络的环境下安装 VS Code Remote-SSH 组件
  • Linux-基础知识总结
  • 【算法300题】:双指针
  • 搭建大模型
  • Dockerfile配置基于 Python 的 Web 应用镜像
  • 前端静态资源免费cdn服务推荐
  • 【分布式 ID】详解百度 uid-generator(源码篇)