外层自由引用对象的设计
外层的设计就是一个简单的单件模式类型,不过同时处于降低客户程序对于工作实例耦合性和访问安全性的考虑。外层Singleton类型仅仅对外提供IWorkItem接口的引用,而非实体的WorkItem类型。
using System;
namespace VisionLogic.DesignPattern.Practice
...{
/**//// <summary>
/// 单件模式的外层引用对象
/// </summary>
public class Singleton
...{
public static readonly Singleton Instance = new Singleton();
![]()
/**//// <summary>
/// 代理获得工作实体的引用
/// </summary>
/// <returns></returns>
public IWorkItem Allocate() ...{ return WorkItemManager.Allocate();}
![]()
/**//// <summary>
/// 对外提供监控信息
/// </summary>
public static int ActiveInstances ...{ get ... { return WorkItemManager.ActiveInstances; } }
public static int Instances ...{ get ...{ return WorkItemManager.Instances; } }
}
}
示例7:外层引用对象的设计
外层客户程序的使用
最后,通过提供一个客户程序验证前面Singleton – N池的有效性:
using System;
using System.Diagnostics;
using VisionLogic.DesignPattern.Practice;
namespace VisionLogic.DesignPattern.Practice.Client
...{
class Program
...{
static void Main(string[] args)
...{
// 通过外层引用对象获得可能的工作实例访问资格
Singleton[] instances = new Singleton[10];
for (int i = 0; i < instances.Length; i++)
instances[i] = Singleton.Instance;
![]()
// 申请和使用工作实例
IWorkItem[] items = new IWorkItem[instances.Length];
for (int i = 0; i < instances.Length; i++)
items[i] = instances[i].Allocate();
Trace.WriteLine(Singleton.Instances);
![]()
for (int i = 0; i < instances.Length; i++)
if (items[i] != null)
...{
items[i].Process();
items[i].Release();
}
![]()
// 等待Singleton - N的自动资源回收
System.Threading.Thread.Sleep(6000);
Trace.WriteLine(Singleton.Instances);
}
}
}
![]()
结果:
5
do something ...
do something ...
do something ...
do something ...
do something ...
0
从结果不难看出,外层的10个引用其实仅仅有5个获得了实际的工作对象,而且实际的工作对象也随着后续处理工作的消失自动的被内层共享资源管理逻辑清理了。
其他说明
后续的进一步Singleton – N可能根据项目的规模和复杂度,需要有更为繁琐的生命期控制,例如COM+中对于组件池的管理规则和Remoting中具体组件的生命期管理。
