• 设计模式 享元模式(Flyweight)
    时间:2012-04-06   作者:孙金棚   出处:cnblogs.com

    意图


    运用共享技术有效地支持大量细粒度的对象。典型的享元模式的例子为文书处理器中以图形结构来表示字符。一个做法是,每个字型有其字型外观, 字模 metrics, 和其它格式资讯,但这会使每个字符就耗用上千字节。取而代之的是,每个字符参照到一个共享字形物件,此物件会被其它有共同特质的字符所分享;只有每个字符(文件中或页面中)的位置才需要另外储存。以下程式用来解释上述的文件例子。这个例子用来解释享元模式利用只载立执行立即小任务所必需的资料,因而减少内存使用量。 

    适用性

    1.一个应用程序使用了大量的对象。
    2.完全由于使用大量的对象,造成很大的存储开销。
    3.对象的大多数状态都可变为外部状态。
    4.如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象。
    5.应用程序不依赖于对象标识。由于F l y w e i g h t 对象可以被共享,对于概念上明显有别的对象,标识测试将返回真值。

    结构图

    享元模式

    // Flyweight
     
     /* Notes:
      * Useful patetn when you have a small(ish) number of objects that might be
      * needed a very large number of times - with slightly differnt informaiton,
      * that can be externalised outside those objects.
      */
     
     namespace Flyweight_DesignPattern
     {
         using System;
         using System.Collections;
     
         class FlyweightFactory
         {
             private ArrayList pool = new ArrayList();
     
             // the flyweightfactory can crete all entries in the pool at startup
     // (if the pool is small, and it is likely all will be used), or as
     // needed, if the pool si large and it is likely some will never be used
             public FlyweightFactory()
             {
                 pool.Add(new ConcreteEvenFlyweight());       
                 pool.Add(new ConcreteUnevenFlyweight());           
             }
     
             public Flyweight GetFlyweight(int key)
             {
                 // here we would determine if the flyweight identified by key
     // exists, and if so return it. If not, we would create it.
     // As in this demo we have implementation all the possible
     // flyweights we wish to use, we retrun the suitable one.
                 int i = key % 2;
                 return((Flyweight)pool[i]);
             }
         }
     
         abstract class Flyweight
         {
             abstract public void DoOperation(int extrinsicState);       
         }
     
         class UnsharedConcreteFlyweight : Flyweight
         {
             override public void DoOperation(int extrinsicState)
             {
                
             }
         }
     
         class ConcreteEvenFlyweight : Flyweight
         {
             override public void DoOperation(int extrinsicState)
             {
                 Console.WriteLine("In ConcreteEvenFlyweight.DoOperation: {0}", extrinsicState);                       
             }
         }
     
         class ConcreteUnevenFlyweight : Flyweight
         {
             override public void DoOperation(int extrinsicState)
             {
                 Console.WriteLine("In ConcreteUnevenFlyweight.DoOperation: {0}", extrinsicState);           
             }   
         }
     
         /// <summary>
     ///    Summary description for Client.
     /// </summary>
         public class Client
         {
             public static int Main(string[] args)
             {
                 int[] data = {1,2,3,4,5,6,7,8};
                
                 FlyweightFactory f = new FlyweightFactory();
                
                 int extrinsicState = 3;
                 foreach (int i in data)
                 {
                     Flyweight flyweight = f.GetFlyweight(i);
                       flyweight.DoOperation(extrinsicState);
                 }
                
                 return 0;
             }
         }
     }

    网友留言/评论

    我要留言/评论

    相关文章

    Windows Phone 录制音频和保存录音开发:Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。2010年10月11日晚上9点30分,微软公司正式发布了智能手机操作系统Windows Phone,同时将谷歌的Android和苹果的IOS列为主要竞争对手。2011年2月,诺基亚与微软达成全球战略同盟并深度合作共同研发,建立庞大的生态系统。Windows Phone 8将采用和Windows 8相同的内核。本文将给大家介绍 Windows Phone 录制音频和保存录音制作
    VC++中关于TCHAR,WCHAR,LPSTR,LPWSTR,LPCTSTR的解释:许多VC++ 程序员对于像TCHAR,LPCTSTR这样诡异的标识符感到非常迷惑。今天,我将尝试简短的把这团迷雾解释清楚。
    如何获取某个进程的主窗口以及创建进程的程序名?:在编写工具程序以及系统管理程序的时候。常常需要获取某个进程的主窗口以及创建此进程的程序名。获取主窗口的目的是向窗口发送各种消息。获取启动进程的程序名可以控制对进程的操作。但是有些进程往往有多个主窗口。你要的是哪一个主窗口呢?如果你用过Outlook程序,你就会发现它有多个主窗口,一个窗口列出收件箱和其它文件夹。如果你打开e-mail,便会有另外一个窗口显示信息。它们都是没有父窗口(或者说宿主窗口)的主窗口。运行一下Spy程序,你甚至会发现它们的窗口类名都相同:rctrl_renwnd32。资源管理器(Explorer.exe)也有不止一个主窗口。如图一所示,资源管理器有两个主窗口。一般来讲,想要获取主窗口,凭窗口的式样或类名,你没有什么办法知道哪一个窗口是真正意义上的主窗口。
    WINDOWS干干净净杀死进程编程:最近在写程序时碰到这样一个问题:我想将文件备份到网络驱动器上,但是有一些文件正在被其它程序使用,处于打开状态,而且是被独占打开,这时是没法对文件进行备份操作的。因此,要想备份这些文件,必须将打开它们的那些进程kill掉。那么如何干净地杀死这些打开文件的进程呢?相信看完本文后,自然会有办法解决!