享元模式





0/5 (0投票)
每当您拥有大量共享公共信息的小型对象时,就会使用享元模式。该模式的使用减少了
它们共享公共信息。
该模式的使用减少了这些对象的存储。
享元区分对象的内部状态(有时称为内在状态)
和外部状态(有时称为外在状态)。
内部状态可以由对象共享,从而最大限度地减少了
对象所需的存储量。
外部状态可以在对象外部计算或存储,并在需要时
提供给对象。
有关该模式的 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 方法中返回。
摘要
总而言之,当您有大量
占用大量内存的对象时,请使用享元模式。当您有
共享公共状态的对象组时,也请使用该模式。
根据我的经验,这个模式很少使用。尽管如此,您也应该了解
这个模式,以便在需要时使用它。