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

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

1. 简介

  • 定义
    • 使用共享对象可有效地支持大量的细粒度的对象。
  • 解决问题
    • 面向对象技术可以很好地解决一些灵活性或可扩展性问题,但在很多情况下需要在系统中增加类和对象的个数。当对象数量太多时,将导致运行代价过高,带来性能下降等问题。享元模式正是为解决这一类问题而诞生的。
  • 原理
    • 享元模式其实就是工厂模式的一个改进机制,享元模式同样要求创建一个或一组对象,并且就是通过工厂方法生成对象的,只不过享元模式中为工厂方法增加了缓存这一功能。
  • 类图
  • 典型的例子,如:string对象,Type对象等,都是使用享元模式设计。

2. 示例

/// /// The 'Flyweight' class./// public class Character{    // intrinsic state    protected char _symbol;    protected int _size;    protected string _font;    // extrinsic state    protected Position _position;    public void Display(Position position)    {        Console.WriteLine(            String.Format("Symbol: {0} Size: {1} Font: {2} Position: {3} {4}",            _symbol, _size, _font, position._x, position._y));    }}/// /// A 'ConcreteFlyweight' class/// public class CharacterA : Character{    public CharacterA()    {        _symbol = 'A';        _size = 10;        _font = "宋体";        //_position = new Position(0, 1);    }}/// /// The 'FlyweightFactory' class/// public class CharacterFactory{    // Keeps the character object by specifying key/value.    private Dictionary
_characters = new Dictionary
(); public Character this[char key] { get { Character character = null; // Checked the character whether existed or not, // if the character existed, then directly returns, // otherwise, instantiates a character object. 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; } }}///
/// The client./// ///
The args.static void Main(string[] args){ string text = "ABZABBZZ"; char[] letters = text.ToCharArray(); var characterFactory = new CharacterFactory(); // Creates random position ranges 0 to 100. var rd = new Random(); foreach (char c in letters) { Character character = characterFactory[c]; var p = new Position(rd.Next(0, 100), rd.Next(0, 100)); character.Display(p); } Console.ReadKey();}

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

你可能感兴趣的文章
Mysql学习总结(41)——MySql数据库基本语句再体会
查看>>
Mysql学习总结(42)——MySql常用脚本大全
查看>>
Mysql学习总结(43)——MySQL主从复制详细配置
查看>>
Mysql学习总结(44)——Linux下如何实现mysql数据库每天自动备份定时备份
查看>>
Mysql学习总结(45)——Mysql视图和事务
查看>>
Mysql学习总结(46)——8种常被忽视的SQL错误用法
查看>>
Mysql学习总结(48)——MySql的日志与备份还原
查看>>
Mysql学习总结(49)——从开发规范、选型、拆分到减压
查看>>
Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型
查看>>
Mysql学习总结(50)——Oracle,mysql和SQL Server的区别
查看>>
Mysql学习总结(51)——Linux主机Mysql数据库自动备份
查看>>
Mysql学习总结(52)——最全面的MySQL 索引详解
查看>>
Mysql学习总结(53)——使用MySql开发的Java开发者规范
查看>>
Mysql学习总结(54)——MySQL 集群常用的几种高可用架构方案
查看>>
Mysql学习总结(55)——MySQL 语句大全再温习
查看>>
Mysql学习总结(56)——MySQL用户管理和权限设置
查看>>
Mysql学习总结(57)——MySQL查询当天、本周、本月、上周、本周、上月、距离当前现在6个月数据
查看>>
Mysql学习总结(58)——深入理解Mysql的四种隔离级别
查看>>
Mysql学习总结(59)——数据库分库分表策略总结
查看>>
Mysql学习总结(5)——MySql常用函数大全讲解
查看>>