泛型单一模式
泛型单一模式类:(fully lazy instantiation)
public sealed class Singleton<T>
where T : class
{
public static T Instance
{
get
{
return Nested.instance;
}
}
private class Nested
{
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested()
{
}
internal static readonly T instance = typeof(T).InvokeMember(typeof(T).Name, BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.NonPublic, null, null, null) as T;
}
}
where T : class
{
public static T Instance
{
get
{
return Nested.instance;
}
}
private class Nested
{
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested()
{
}
internal static readonly T instance = typeof(T).InvokeMember(typeof(T).Name, BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.NonPublic, null, null, null) as T;
}
}
实现要点
1. 静态构造函数
静态构造函数用于初始化任何静态数据,所以它的执行顺序应该在静态成员初始化之后。
class Test
{
static int value= 1; //第一步
static string staticString;
static Test()
{//第三步
value = 2;
value2= 3;
}
public static int value2= 1; //第二步
}
当程序第一次执行如下语句时
Test test= new Test();
执行顺序就是上面标出的步骤。
也就是说
test.value = 2
test.value2 = 3
{
static int value= 1; //第一步
static string staticString;
static Test()
{//第三步
value = 2;
value2= 3;
}
public static int value2= 1; //第二步
}
当程序第一次执行如下语句时
Test test= new Test();
执行顺序就是上面标出的步骤。
也就是说
test.value = 2
test.value2 = 3
2. 嵌套类的静态构造函数的作用
嵌套类的静态构造函数不会随着外部类的触发而初始化。有了嵌套类的静态构造函数,它会告诉C#编译器只有当需要使用内嵌类的时候,嵌套类的静态数据才开始初始化。所以上面介绍的单一模式是属于完全延迟初始化。
3.利用反射时使用"BidingFlags.NonPublic”,确保调用的的具体单一实例类中的private constructor.事实上,具体单一实例类中不应该有public的构造函数。为了就是确保不被误实例化。
4.使用sealed 关键字,防止被继承。
具体单一实例类:
Code
Main:
Code
为什么不用double-check locking来实现,请参照
http://www.yoda.arachsys.com/csharp/singleton.html
泛型单一模式参考地址:
http://www.codeproject.com/KB/architecture/GenericSingletonPattern.aspx