当前位置: 首页 > 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.lryc.cn/news/594072.html

相关文章:

  • 第十四讲 | AVL树实现
  • [simdjson] `error_code` | .get() | 异常 | is_fatal() | current_location() | 链式处理
  • 苍穹外卖|项目日记(完工总结)
  • 【JS逆向基础】数据库之mysql
  • pip关于缓存的用法
  • Ubuntu挂载和取消挂载
  • 开源安全大模型Foundation-Sec 8B的安全实践
  • PPT科研画图插件
  • 如何使用Python将任意PPT变为“智能模板”(解决 python-pptx 替换元素无法保留格式的问题,阴影、填充等属性保留!)
  • 深度学习篇---矩阵
  • 深度学习图像分类数据集—百种病虫害分类
  • linux + 宝塔面板 部署 django网站 启动方式:uwsgi 和gunicorn如何选择 ?
  • k8s:离线部署存在的相关问题
  • day 30 打卡
  • Redis 详解:从入门到进阶
  • MySQL 配置性能优化实操指南:分版本5.7和8.0适配方案
  • 【Anaconda】Conda 虚拟环境打包迁移教程
  • Redis通用常见命令(含面试题)
  • 28.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--币种服务(二)
  • 零基础学习性能测试第二章-linux/jvm/mysql等数据收集环境搭建
  • Feign远程调用
  • 在Ubuntu22系统上离线部署ai-infra-guard教程【亲测成功】
  • 【成品设计】基于STM32的宠物检测系统
  • ubuntu-linux-pycharm-社区版安装与django配置
  • 数据结构自学Days10 -- 二叉树的常用实现
  • 基于Chinese-LLaMA-Alpaca-3的多模态中医舌诊辅助诊断系统设计与实现
  • 【Linux】2. Linux下的C/C++开发环境
  • 使用“桥接模式“,实现跨平台绘图或多类型消息发送机制
  • 元宇宙经济的四个特征
  • Python,GPU编程新范式:CuPy与JAX在大规模科学计算中的对比