zoukankan      html  css  js  c++  java
  • 享元模式

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

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

    工厂可以有效的维护状态,使数据进行共享,该方法可灵活应用。
  • 相关阅读:
    std::bind 详解及参数解析
    c++ 静态类成员函数(static member function) vs 名字空间 (namespace)
    继续进发
    lua闭包
    Mysql按时间段分组查询来统计会员的个数
    linux安装配置sendmail实现邮件发送
    Javascript验证用户输入URL地址是否正确
    php返回json数据函数例子
    ArrayList与List对象用法与区别
    java 获取数组(二维数组)长度实例程序
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1809547.html
Copyright © 2011-2022 走看看