代码改变世界

享元模式

2010-08-26 22:17  Clingingboy  阅读(438)  评论(0编辑  收藏  举报

      运用 单例+工厂来维护一组对象状态,并有效的减少对象实例化的数量

image_2

这个模式关键的实现在于这个工厂类

1.接口

public interface IFlyweight {
   void Load (string filename);
   void Display (PaintEventArgs e, int row, int col);
 }


2.具体实现的类

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];
         }
     }
 }

工厂可以有效的维护状态,使数据进行共享,该方法可灵活应用。