Core Design Patterns(5) Flyweight 享元模式
VS 2008
应用程序中,当需要提供某种大量细粒度对象的访问,并且对这些对象可以抽象出不可变的属性,那么可以将抽象出来的对象设计为享元,供各个客户端共享访问,以节省内存开销。
而剩下的不能共享的属性,则可以由客户端维护,并在需要的时候传入享元,传入的不能共享的属性不能影响内部的不可变属性。
1. 模式UML图
![](/images/cnblogs_com/guozhijian/Design Pattern/flyweight-1.gif)
2. 应用
目前的应用程序探测系统中,需要对许多应用程序进行探测,探测各种可能出现的异常,探测到异常后,需要将异常抛出,既告诉探测程序当前发生异常的应用程序的信息以及异常消息。
考虑使用享元模式,使得对于同一个应用程序的多个线程共享应用程序信息。
![](/images/cnblogs_com/guozhijian/Design Pattern/flyweight-3.gif)
示意性代码:
IAlarmEventArgs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.Flyweight.BLL {
public interface IAlarmEventArgs {
void Display(string message);
}
}
AlarmEventArgs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.Flyweight.BLL {
public class AlarmEventArgs : IAlarmEventArgs {
![](/Images/OutliningIndicators/InBlock.gif)
private string m_AppName;
![](/Images/OutliningIndicators/InBlock.gif)
public AlarmEventArgs(string appName) {
this.m_AppName = appName;
}
![](/Images/OutliningIndicators/InBlock.gif)
IAlarmEventArgs Members
}
}
AlarmEventArgsFactory
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.Flyweight.BLL {
public class AlarmEventArgsFactory {
![](/Images/OutliningIndicators/InBlock.gif)
private Dictionary<string, IAlarmEventArgs> dictionary = new Dictionary<string, IAlarmEventArgs>();
![](/Images/OutliningIndicators/InBlock.gif)
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;
![](/Images/OutliningIndicators/None.gif)
namespace DesignPattern.Flyweight {
class Program {
static void Main(string[] args) {
![](/Images/OutliningIndicators/InBlock.gif)
AlarmEventArgsFactory factory = new AlarmEventArgsFactory();
![](/Images/OutliningIndicators/InBlock.gif)
string appName1 = "sh3hgridservice";
factory.Create(appName1).Display("thread stopped!");
![](/Images/OutliningIndicators/InBlock.gif)
factory.Create(appName1).Display("connect to database failed!");
![](/Images/OutliningIndicators/InBlock.gif)
}
}
}
Output
![](/images/cnblogs_com/guozhijian/Design Pattern/flyweight-4.gif)
3. 思考
关于intrinsic state和extrinsic state
确保我们共享的是前者,而后者只在客户端维护,并在需要的时候才传入享元
并且后者传入享元后不会影响到前者
应用程序中,当需要提供某种大量细粒度对象的访问,并且对这些对象可以抽象出不可变的属性,那么可以将抽象出来的对象设计为享元,供各个客户端共享访问,以节省内存开销。
而剩下的不能共享的属性,则可以由客户端维护,并在需要的时候传入享元,传入的不能共享的属性不能影响内部的不可变属性。
1. 模式UML图
![](/images/cnblogs_com/guozhijian/Design Pattern/flyweight-1.gif)
2. 应用
目前的应用程序探测系统中,需要对许多应用程序进行探测,探测各种可能出现的异常,探测到异常后,需要将异常抛出,既告诉探测程序当前发生异常的应用程序的信息以及异常消息。
考虑使用享元模式,使得对于同一个应用程序的多个线程共享应用程序信息。
![](/images/cnblogs_com/guozhijian/Design Pattern/flyweight-3.gif)
示意性代码:
IAlarmEventArgs
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
AlarmEventArgs
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
AlarmEventArgsFactory
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
Client
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
Output
![](/images/cnblogs_com/guozhijian/Design Pattern/flyweight-4.gif)
3. 思考
关于intrinsic state和extrinsic state
确保我们共享的是前者,而后者只在客户端维护,并在需要的时候才传入享元
并且后者传入享元后不会影响到前者