理解:有大量相同类型对象需要创造出来时,可以一种类型只保存一个实例,可以改它的外部状态(如位置,名称等)
代码:
using System.Collections;
using System.Windows.Forms;
namespace DesignMode.Flyweight
{
//抽象棋子类
public abstract class Chessman
{
public abstract void Move(int x,int y);
}
//白棋子
public class White_Chessman : Chessman
{
public override void Move(int x,int y)
{
MessageBox.Show("白棋下在:X=" + x + ",Y=" + y);
}
}
//黑棋子
public class Black_Chessman : Chessman
{
public override void Move(int x, int y)
{
MessageBox.Show("黑棋下在:X=" + x + ",Y=" + y);
}
}
public class ChessmanFactory
{
private Hashtable chessmans = new Hashtable();
public Chessman GetChessman(string color)
{
if (!chessmans.ContainsKey(color))
{
if (color.Equals("白"))
{
chessmans.Add(color, new White_Chessman());
}
else
{
chessmans.Add(color, new Black_Chessman());
}
}
return (Chessman)chessmans[color];
}
}}
using System.Windows.Forms;
namespace DesignMode.Flyweight
{
//抽象棋子类
public abstract class Chessman
{
public abstract void Move(int x,int y);
}
//白棋子
public class White_Chessman : Chessman
{
public override void Move(int x,int y)
{
MessageBox.Show("白棋下在:X=" + x + ",Y=" + y);
}
}
//黑棋子
public class Black_Chessman : Chessman
{
public override void Move(int x, int y)
{
MessageBox.Show("黑棋下在:X=" + x + ",Y=" + y);
}
}
public class ChessmanFactory
{
private Hashtable chessmans = new Hashtable();
public Chessman GetChessman(string color)
{
if (!chessmans.ContainsKey(color))
{
if (color.Equals("白"))
{
chessmans.Add(color, new White_Chessman());
}
else
{
chessmans.Add(color, new Black_Chessman());
}
}
return (Chessman)chessmans[color];
}
}}
客户端代码:
private void btn_Flyweight_Click(object sender, EventArgs e)
{
ChessmanFactory factory = new ChessmanFactory();
Chessman white1 = factory.GetChessman("白");
white1.Move(5, 10);
Chessman black1 = factory.GetChessman("黑");
black1.Move(6, 12);
Chessman white2 = factory.GetChessman("白");
white2.Move(7, 14);
Chessman black2 = factory.GetChessman("黑");
black2.Move(10, 18);
}