经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
Flyweight享元模式
来源:cnblogs  作者:大师兄石头  时间:2021/2/18 15:34:39  对本文有异议

>>返回《C#常用设计模式》

1. 简介

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

2. 示例

  1. /// <summary>
  2. /// The 'Flyweight' class.
  3. /// </summary>
  4. public class Character
  5. {
  6. // intrinsic state
  7. protected char _symbol;
  8. protected int _size;
  9. protected string _font;
  10. // extrinsic state
  11. protected Position _position;
  12. public void Display(Position position)
  13. {
  14. Console.WriteLine(
  15. String.Format("Symbol: {0} Size: {1} Font: {2} Position: {3} {4}",
  16. _symbol, _size, _font, position._x, position._y));
  17. }
  18. }
  19. /// <summary>
  20. /// A 'ConcreteFlyweight' class
  21. /// </summary>
  22. public class CharacterA : Character
  23. {
  24. public CharacterA()
  25. {
  26. _symbol = 'A';
  27. _size = 10;
  28. _font = "宋体";
  29. //_position = new Position(0, 1);
  30. }
  31. }
  32. /// <summary>
  33. /// The 'FlyweightFactory' class
  34. /// </summary>
  35. public class CharacterFactory
  36. {
  37. // Keeps the character object by specifying key/value.
  38. private Dictionary<char, Character> _characters =
  39. new Dictionary<char, Character>();
  40. public Character this[char key]
  41. {
  42. get
  43. {
  44. Character character = null;
  45. // Checked the character whether existed or not,
  46. // if the character existed, then directly returns,
  47. // otherwise, instantiates a character object.
  48. if (_characters.ContainsKey(key))
  49. {
  50. character = _characters[key];
  51. }
  52. else
  53. {
  54. string name = this.GetType().Namespace + "." +
  55. "Character" + key.ToString();
  56. character = Activator.CreateInstance(
  57. Type.GetType(name)) as Character;
  58. _characters.Add(key, character);
  59. }
  60. return character;
  61. }
  62. }
  63. }
  64. /// <summary>
  65. /// The client.
  66. /// </summary>
  67. /// <param name="args">The args.</param>
  68. static void Main(string[] args)
  69. {
  70. string text = "ABZABBZZ";
  71. char[] letters = text.ToCharArray();
  72. var characterFactory = new CharacterFactory();
  73. // Creates random position ranges 0 to 100.
  74. var rd = new Random();
  75. foreach (char c in letters)
  76. {
  77. Character character = characterFactory[c];
  78. var p = new Position(rd.Next(0, 100), rd.Next(0, 100));
  79. character.Display(p);
  80. }
  81. Console.ReadKey();
  82. }

原文链接:http://www.cnblogs.com/BigBrotherStone/p/flyweight.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号