1.说明:
namespace FlyweightPattern
{
/*
* 享元模式:实际来看,享元模式其实是为了避免创建过多的数据对象。
* 比如此列:在象棋中只有红黑双方,红棋子只是红棋中的一颗,很多
* 红棋其实可以使用一个红棋对象表示即可,在外部只需公开该棋的状
* 态即可区分那个红棋,从而达到减少内存消耗的目的
*/
/// <summary>
/// 一个表示象棋的接口
/// </summary>
public interface IChess
{
void Move(Pieces pieces);//移动棋子
}
/// <summary>
/// 具体的棋子的移动方式
/// </summary>
public class Pieces
{
public string Action;//棋子的移动方式
public Pieces(string action)
{
this.Action = action;
}
}
/// <summary>
/// 具体的棋子
/// </summary>
public class Chess : IChess
{
private string Name;
public Chess(string name)
{
this.Name = name;
}
#region IChess 成员
public void Move(Pieces pieces)
{
Console.WriteLine("{0} {1}", Name, pieces.Action);
}
#endregion
}
public class ChessFactory
{
private Hashtable Chesss = new Hashtable();
/// <summary>
/// 象棋的颜色
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public Chess GetChess(string key)
{
if (!Chesss.ContainsKey(key))
Chesss.Add(key,new Chess(key));
return (Chess)Chesss[key];
}
/// <summary>
/// 返回棋子的种类
/// </summary>
/// <returns></returns>
public int GetChessCount()
{
return Chesss.Count;
}
}
}
2.调用
static void Main(string[] args)
{
//生产棋子的工厂
ChessFactory cf = new ChessFactory();
Chess c1 = cf.GetChess("红棋");
c1.Move(new Pieces("出马"));
Chess c4 = cf.GetChess("黑棋");
c4.Move(new Pieces("出马"));
Chess c2 = cf.GetChess("红棋");
c2.Move(new Pieces("出车"));
Chess c5 = cf.GetChess("黑棋");
c5.Move(new Pieces("出马"));
Chess c3 = cf.GetChess("红棋");
c3.Move(new Pieces("出炮"));
Chess c6 = cf.GetChess("黄棋");
c6.Move(new Pieces("认输"));
Console.WriteLine("棋子的种类数:{0}",cf.GetChessCount());
Console.ReadKey();
}