Core Design Patterns(5) Flyweight 享元模式

VS 2008

应用程序中,当需要提供某种大量细粒度对象的访问,并且对这些对象可以抽象出不可变的属性,那么可以将抽象出来的对象设计为享元,供各个客户端共享访问,以节省内存开销。
而剩下的不能共享的属性,则可以由客户端维护,并在需要的时候传入享元,传入的不能共享的属性不能影响内部的不可变属性。

1. 模式UML图



2. 应用

    目前的应用程序探测系统中,需要对许多应用程序进行探测,探测各种可能出现的异常,探测到异常后,需要将异常抛出,既告诉探测程序当前发生异常的应用程序的信息以及异常消息。
    考虑使用享元模式,使得对于同一个应用程序的多个线程共享应用程序信息。


示意性代码:

IAlarmEventArgs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPattern.Flyweight.BLL {
    
public interface IAlarmEventArgs {
        
void Display(string message);
    }

}

AlarmEventArgs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPattern.Flyweight.BLL {
    
public class AlarmEventArgs : IAlarmEventArgs {

        
private string m_AppName;

        
public AlarmEventArgs(string appName) {
            
this.m_AppName = appName;
        }


        
IAlarmEventArgs Members
    }

}


AlarmEventArgsFactory

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DesignPattern.Flyweight.BLL {
    
public class AlarmEventArgsFactory {

        
private Dictionary<string, IAlarmEventArgs> dictionary = new Dictionary<string, IAlarmEventArgs>();

        
public IAlarmEventArgs Create(string appName) {
            
if (!dictionary.ContainsKey(appName)) {
                dictionary.Add(appName, 
new AlarmEventArgs(appName));
            }

            
return dictionary[appName];
        }

    }

}


Client

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DesignPattern.Flyweight.BLL;

namespace DesignPattern.Flyweight {
    
class Program {
        
static void Main(string[] args) {

            AlarmEventArgsFactory factory 
= new AlarmEventArgsFactory();

            
string appName1 = "sh3hgridservice";
            factory.Create(appName1).Display(
"thread stopped!");

            factory.Create(appName1).Display(
"connect to database failed!");

        }

    }

}


Output



3. 思考

关于intrinsic state和extrinsic state
确保我们共享的是前者,而后者只在客户端维护,并在需要的时候才传入享元
并且后者传入享元后不会影响到前者
posted on 2008-03-08 15:20  Tristan(GuoZhijian)  阅读(449)  评论(0编辑  收藏  举报