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

    工厂可以有效的维护状态,使数据进行共享,该方法可灵活应用。
  • 相关阅读:
    private
    接口
    抽象类的认识
    静态导入和类中的代码块
    instanceof 与 应用类型强转
    重写的理解
    继承初体验
    赶紧收藏!春招Java面经总结,拿大厂Offer的必备复习资料!
    react native 升级到0.31.0的相关问题 mac xcode开发环境
    c# 线程池多任务处理并返回值
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1809547.html
Copyright © 2011-2022 走看看