Flyweight享元模式

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

  • 1. 简介
  • 2. 示例

1. 简介

  • 定义

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

2. 示例

/// <summary>
/// The 'Flyweight' class.
/// </summary>
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));
    }

}

/// <summary>
/// A 'ConcreteFlyweight' class
/// </summary>
public class CharacterA : Character
{
    public CharacterA()
    {
        _symbol = 'A';
        _size = 10;
        _font = "宋体";
        //_position = new Position(0, 1);
    }
}

/// <summary>
/// The 'FlyweightFactory' class
/// </summary>
public class CharacterFactory
{
    // Keeps the character object by specifying key/value.
    private Dictionary<char, Character> _characters =
        new Dictionary<char, Character>();

    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;
        }
    }
}

/// <summary>
/// The client.
/// </summary>
/// <param name="args">The args.</param>
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();
}
(0)

相关推荐

  • 设计模式(11) 享元模式

    基于面向对象思想设计的应用程序有时遇到需要场景大量相同或显示对象实例的场景,这些数量庞大的实例很可能会消耗很多系统资源,最直接的就是内存了.比如要一款围棋游戏,如果每次落子都新建一个对象,将会占用大量 ...

  • 结构型模式之享元模式

    在面向对象程序设计过程中,有时会面临要创建大量相同或相似对象实例的问题.创建那么多的对象将会耗费很多的系统资源,它是系统性能提高的一个瓶颈.例如,围棋和五子棋中的黑白棋子,图像中的坐标点或颜色,局域网 ...

  • 设计模式-享元模式

    定义 运用共享技术有效地支持大量细粒度的对象. 适用场景 例如,数据库连接,线程的创建开销都比较大,并且创建频率也非常高,因此就需要用到数据库连接池技术和线程池技术来共享数据库连接和线程.再例如,应用 ...

  • PHP设计模式之享元模式

    PHP设计模式之享元模式 享元模式,"享元"这两个字在中文里其实并没有什么特殊的意思,所以我们要把它拆分来看."享"就是共享,"元"就是元素 ...

  • [PHP小课堂]PHP设计模式之享元模式

    [PHP小课堂]PHP设计模式之享元模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • 泡图书馆,我想到了 享元模式

    回复"000"获取程序员必备电子书 大家好,我是老田,今天我给大家分享设计模式中的享元模式.用贴切的生活故事,以及真实项目场景来讲设计模式,最后用一句话来总结这个设计模式. 另外, ...

  • 设计模式之享元模式

    享元模式 Flyweight Intro 享元是指一个可复用的对象,通过复用这个享元来减少应用中的内存分配. 享元模式是为了减少内存占用,尽可能复用已有对象的设计模式,一般来说会把这个可复用的对象放到 ...

  • 无废话设计模式(9)结构型模式--享元模式

    0-前言 享元模式定义:运用共享技术有效地支持大量细粒度的对象. 1-实现 1-1.简单UML图:  1-2.代码实现 //1.抽象父类(网站父类) abstract class Website { ...

  • 设计模式 --面试高频之享元模式

    前言 享元模式是非常常用的一种结构性设计模式. 特别是在面试的时候.当我们把这一节内容掌握,我相信不管是工作中还是面试中这一块内容绝对是一大亮点. 什么是享元模式 所谓"享元",顾 ...