运用 单例+工厂来维护一组对象状态,并有效的减少对象实例化的数量
这个模式关键的实现在于这个工厂类
1.接口
public interface IFlyweight { void Load (string filename); void Display (PaintEventArgs e, int row, int col); }
public struct Flyweight : IFlyweight { // Intrinsicstate Image pThumbnail; public void Load (string filename) { pThumbnail = new Bitmap("images/"+filename). GetThumbnailImage(100, 100, null, new IntPtr()); } public void Display(PaintEventArgs e, int row, int col) { // Calculating extrinsic state e.Graphics.DrawImage(pThumbnail,col*100+10, row*130+40, pThumbnail.Width,pThumbnail.Height); } }
3.工厂
该类最好成为单例模式,否则这个模式就废掉了.
public class FlyweightFactory { // Keeps an indexed list of IFlyweight objects in existance Dictionary <string,IFlyweight> flyweights = new Dictionary <string,IFlyweight> (); public FlyweightFactory () { flyweights.Clear(); } public IFlyweight this[string index] { get { if (!flyweights.ContainsKey(index)) flyweights[index] = new Flyweight(); return flyweights[index]; } } }
改进如下
public class SingletonFlyweightFactory { // Keeps an indexed list of IFlyweight objects in existance Dictionary<string, IFlyweight> flyweights = new Dictionary<string, IFlyweight>(); private static SingletonFlyweightFactory instance; private SingletonFlyweightFactory() { } public SingletonFlyweightFactory Instance { get { if (instance != null) { instance = new SingletonFlyweightFactory(); } return instance; } } public IFlyweight this[string index] { get { if (!flyweights.ContainsKey(index)) flyweights[index] = new Flyweight(); return flyweights[index]; } } }
工厂可以有效的维护状态,使数据进行共享,该方法可灵活应用。