65.9K
CodeProject 正在变化。 阅读更多。
Home

享元模式

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2013 年 10 月 11 日

CPOL

3分钟阅读

viewsIcon

6612

每当您拥有大量共享公共信息的小型对象时,就会使用享元模式。该模式的使用减少了

每当您拥有大量小型对象时,就会使用享元模式
它们共享公共信息。
该模式的使用减少了这些对象的存储。
享元区分对象的内部状态(有时称为内在状态)
和外部状态(有时称为外在状态)。
内部状态可以由对象共享,从而最大限度地减少了
对象所需的存储量。
外部状态可以在对象外部计算或存储,并在需要时
提供给对象。
有关该模式的 UML 图,请访问 dofactory 网站

享元 C# 示例
让我们来看一个使用享元模式的示例:

    #region 辅助

 

    public enum eNumbers

    {

        One,

        Two,

        Three,

        // .. 以此类推,包含每个数字

    }

 

    #endregion

 

    #region 享元工厂

 

    public class NumbersFactory

    {

        #region 成员

 

        private Dictionary<eNumbers, Number> _numbers =

            new Dictionary<eNumbers, Number>();

 

        #endregion

 

        #region 方法

 

        public Number GetNumber(eNumbers number)

        {

            if (!_numbers.ContainsKey(number))

            {

                switch (number)

                {

                    case (eNumbers.One)

                        {

                            _numbers.Add(number, new One());

                            break;

                        }

                    case (eNumbers.Two)

                        {

                            _numbers.Add(number, new Two());

                            break;

                        }

                    case (eNumbers.Three)

                        {

                            _numbers.Add(number, new Three());

                            break;

                        }

                        // ... 以此类推,包含每个数字

                    默认:

                        {

                            break;

                        }

                }

            }

            return _numbers[number];

        }

 

        #endregion

    }

 

    #endregion

 

    #region 享元

 

    public abstract class Number

    {

        #region 成员

 

        protected int _number;

        protected string _numberName;

        protected int _numberSize;

 

        #endregion

 

        #region 方法

 

        public abstract void WriteNumber(int numberSize);

 

        #endregion

    }

 

    #endregion

 

    #region 享元具体类

 

    public class One : Number

    {

        #region 构造函数

 

        public One()

        {

            this._number = 1;

            this._numberName = "One";

        }

 

        #endregion

 

        #region 方法

 

        public override void WriteNumber(int numberSize)

        {

            this._numberSize = numberSize;

            Console.WriteLine(string.Format("{0} is size {1}",

                _numberName, _numberSize));

        }

 

        #endregion

    }

 

    public class Two : Number

    {

        #region 构造函数

 

        public Two()

        {

            this._number = 2;

            this._numberName = "Two";

        }

 

        #endregion

 

        #region 方法

 

        public override void WriteNumber(int numberSize)

        {

            this._numberSize = numberSize;

            Console.WriteLine(string.Format("{0} is size {1}",

                _numberName, _numberSize));

        }

 

        #endregion

    }

 

    public class Three : Number

    {  

        #region 构造函数

 

        public Three()

        {

            this._number = 3;

            this._numberName = "Three";

        }

 

        #endregion

 

        #region 方法

 

        public override void WriteNumber(int numberSize)

        {

            this._numberSize = numberSize;

            Console.WriteLine(string.Format("{0} is size {1}",

                _numberName, _numberSize));

        }

 

        #endregion

    }

 

    // ... Four, Five and so on

 

    #endregion

该示例包含三个部分 - 享元工厂 (NumberFactory)、
享元本身 (Number) 和享元具体类 (One, Two, Three)。您可以看到工厂中
使用了延迟加载。每当需要一个数字但工厂中没有该数字时,我就会创建它,
然后在 GetNumber 方法中返回。

摘要
总而言之,当您有大量
占用大量内存的对象时,请使用享元模式。当您有
共享公共状态的对象组时,也请使用该模式。
根据我的经验,这个模式很少使用。尽管如此,您也应该了解
这个模式,以便在需要时使用它。

© . All rights reserved.