Core Design Patterns(5) Flyweight 享元模式
VS 2008
应用程序中,当需要提供某种大量细粒度对象的访问,并且对这些对象可以抽象出不可变的属性,那么可以将抽象出来的对象设计为享元,供各个客户端共享访问,以节省内存开销。
而剩下的不能共享的属性,则可以由客户端维护,并在需要的时候传入享元,传入的不能共享的属性不能影响内部的不可变属性。
1. 模式UML图
2. 应用
目前的应用程序探测系统中,需要对许多应用程序进行探测,探测各种可能出现的异常,探测到异常后,需要将异常抛出,既告诉探测程序当前发生异常的应用程序的信息以及异常消息。
考虑使用享元模式,使得对于同一个应用程序的多个线程共享应用程序信息。
示意性代码:
IAlarmEventArgs
AlarmEventArgs
AlarmEventArgsFactory
Client
Output
3. 思考
关于intrinsic state和extrinsic state
确保我们共享的是前者,而后者只在客户端维护,并在需要的时候才传入享元
并且后者传入享元后不会影响到前者
应用程序中,当需要提供某种大量细粒度对象的访问,并且对这些对象可以抽象出不可变的属性,那么可以将抽象出来的对象设计为享元,供各个客户端共享访问,以节省内存开销。
而剩下的不能共享的属性,则可以由客户端维护,并在需要的时候传入享元,传入的不能共享的属性不能影响内部的不可变属性。
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);
}
}
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
}
}
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];
}
}
}
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!");
}
}
}
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
确保我们共享的是前者,而后者只在客户端维护,并在需要的时候才传入享元
并且后者传入享元后不会影响到前者