博客
关于我
Flyweight享元模式
阅读量:396 次
发布时间:2019-03-05

本文共 2185 字,大约阅读时间需要 7 分钟。

享元模式

简介

享元模式是一种面向对象设计模式,通过共享对象来有效支持大量细粒度的对象需求。这种模式特别适用于在系统中需要频繁创建对象但又不愿意为每个对象都分配大量资源的情况。

优势

传统的面向对象编程中,频繁创建对象会导致性能问题,尤其是在处理大量对象时。享元模式通过共享对象实例,减少了对象的数量,从而降低了系统的运行代价。这种模式在处理灵活性和可扩展性方面具有显著优势。

原理

享元模式建立在工厂模式之上,核心思想是通过工厂方法创建对象,同时增加了对象缓存功能。这种缓存机制使得多个请求可以共享同一个实例,从而提高了系统的效率。

类图

以下是一个典型的享元模式类图示:

+-------------------+|                  ||  Flyweight        ||                  |+-------------------+     ^          ^     |          |     v          v+-------------------+|  ConcreteFlyweight||                  |+-------------------+

示例

以下是一个使用享元模式的典型示例:

public class Character{    // 内在状态    protected char _symbol;    protected int _size;    protected string _font;    // 外部状态    protected Position _position;    public void Display(Position position)    {        Console.WriteLine("字符: {0}, 字号: {1}, 字体: {2}, 位置: ({3}, {4})",             _symbol, _size, _font, position._x, position._y);    }}public class CharacterA : Character{    public CharacterA()    {        _symbol = 'A';        _size = 10;        _font = "宋体";    }}public class CharacterFactory{    private Dictionary
_characters = new Dictionary
(); public Character this[char key] { get { Character character = null; if (_characters.ContainsKey(key)) { character = _characters[key]; } else { string name = this.GetType().Namespace + "." + "Character" + key.ToString(); character = Activator.CreateInstance(Type.GetType(name)) as Character; _characters.Add(key, character); } return character; } }}public class Program{ public static void Main(string[] args) { string text = "ABZABBZZ"; char[] letters = text.ToCharArray(); var characterFactory = new CharacterFactory(); var rd = new Random(); foreach (char c in letters) { Character character = characterFactory[c]; Position p = new Position(rd.Next(0, 100), rd.Next(0, 100)); character.Display(p); } Console.ReadKey(); }}

典型应用场景

享元模式在以下场景中表现尤为突出:

  • 字符显示(如文本渲染)
  • 图像绘制
  • 扩展性需求
  • 性能敏感的系统

转载地址:http://fdozz.baihongyu.com/

你可能感兴趣的文章
ORA-00069: cannot acquire lock
查看>>
ORA-00923: 未找到要求的 FROM 关键字
查看>>
ORA-00932: inconsistent datatypes: expected - got NCLOB【ORA-00932: 数据类型不一致: 应为 -, 但却获得 NCLOB 】【解决办法】
查看>>
ORA-00942 表或视图不存在
查看>>
ORA-01034: ORACLE not available
查看>>
ORA-01152: 文件 1 没有从过旧的备份中还原
查看>>
ORA-01207:文件比控制文件更新 - 旧的控制文件
查看>>
ORA-01795: 列表中的最大表达式数为 1000
查看>>
ORA-06575: 程序包或函数 NO_VM_DROP_PROC 处于无效状态
查看>>
ORA-08102的错误
查看>>
ORA-12505, TNS:listener does not currently know of SID given in connect descriptor异常
查看>>
ORA-12514: TNS:listener does not currently know of service问题原因
查看>>
ora-12541:tns:no listener
查看>>
【docker知识】联合文件系统(unionFS)原理
查看>>
ORACEL学习--理解over()函数
查看>>
ORAchk-数据库健康检查
查看>>
oracle 10g crs命令,Oracle 10g CRS安装问题解决一例
查看>>
Oracle 10g ORA-01034: ORACLE not available 错误
查看>>
oracle 10g的安装配置
查看>>
Oracle 11.2.0.4 x64 RAC修改public/private/vip/scan地址
查看>>