>>回傳《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();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/260258.html
標籤:設計模式
上一篇:Facade外觀模式
下一篇:Decorator裝飾模式
