代码改变世界

享元模式

  Clingingboy  阅读(439)  评论(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];
         }
     }
 }

工厂可以有效的维护状态,使数据进行共享,该方法可灵活应用。
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2009-08-26 Spring.NET学习笔记(6)-基础AOP
点击右上角即可分享
微信分享提示