当前位置: 首页 > 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.dtcms.com/a/289145.html

相关文章:

  • MPLS转发
  • windows C#-本地函数
  • Docker Compose 配置
  • docker compose 编排容器 mysql Springboot应用
  • 使用pytorch创建模型时,nn.BatchNorm1d(128)的作用是什么?
  • gradle关于dependency-management的使用
  • SpringBoot 整合 Langchain4j 实现会话记忆存储深度解析
  • OpenCV 入门知识:图片展示、摄像头捕获、控制鼠标及其 Trackbar(滑动条)生成!
  • 【LeetCode刷题指南】--反转链表,链表的中间结点,合并两个有序链表
  • Day25| 491.递增子序列、46.全排列
  • SQL Server(2022)安装教程及使用_sqlserver下载安装图文
  • redis-plus-plus安装与使用
  • [BUG]关于UE5.6编译时出现“Microsoft.MakeFile.Targets(44,5): Error MSB3073”问题的解决
  • 30天打牢数模基础-SVM讲解
  • Facebook 开源多季节性时间序列数据预测工具:Prophet 快速入门 Quick Start
  • UE5多人MOBA+GAS 26、为角色添加每秒回血回蓝(番外:添加到UI上)
  • Go并发聊天室:从零构建实战
  • Mysql(事务)
  • 30个常用的Linux命令汇总和实战场景示例
  • 30天打牢数模基础-粒子群算法讲解
  • 详解Mysql索引合并
  • Jetpack - ViewModel、LiveData、DataBinding(数据绑定、双向数据绑定)
  • langchain调用本地ollama语言模型和嵌入模型
  • 梯度提升之原理
  • COGNEX康耐视IS5403-01智能相机加Navitar 18R00 LR1010WM52镜头
  • React 英语打地鼠游戏——一个寓教于乐的英语学习游戏
  • [Windows] Bili视频转图文笔记 v1.7.5
  • 网鼎杯2020青龙组notes复现
  • 7. 命令模式
  • Modbus Slave 使用教程:快速搭建模拟从站进行测试与开发