浅析软件项目开发中的单件模式

http://tech.ddvip.com   2008年01月22日    社区交流

内容摘要:单件(Singleton)模式是设计模式的一个典型且相对简单的构造型模式。本文举实例说明单件模式的主要注意事项和多线程环境下的单件模式。

using System;
namespace VisionLogic.DesignPattern.Practice
...{
public class Singleton
...{
private static volatile Singleton instance;
private static object root = new object();
private Singleton() ...{ }
public static Singleton Instance
...{
get
...{
if (instance == null)
...{
lock (root)
...{
if (instance == null)
instance = new Singleton();
}
}
return instance;
}
}
}
}

  示例10:通过两次instace == null检查保证高效的单件实例获取

using System;
namespace VisionLogic.DesignPattern.Practice
...{
public class Singleton
...{
public static readonly Singleton Instance = new Singleton();
}
}

  示例11:微软MSDN站点上提供的通过静态只读实例方式实现的多线程安全的单件模式

  后者虽然在实现代码上仅仅简化为一句,但是通过分析其IL就可以了解他为什么可以保证即便在多线程环境下仍然可以保证单件。

浅析软件项目开发中的单件模式

  图:通过只读静态构造函数完成的单件模式编译结果

  其中,请注意.class public auto ansi beforefieldinit部分,它等于CLR内置的静态构造机制帮助我们完成了加锁过程,确保了只有静态的对象在默认提供的静态构造器创建之前,实例的所有属性不能够被访问。而唯一实例静态的Instance则可以安安稳稳地在默认的静态构造器中创建。下面是编译器生成的静态构造函数。

.method private hidebysig specialname rtspecialname static
void .cctor() cil managed
...{
// Code size    11 (0xb)
.maxstack 8
IL_0000: newobj    
instance void VisionLogic.DesignPattern.Practice.Singleton::.ctor()
IL_0005: stsfld    
class VisionLogic.DesignPattern.Practice.Singleton      
VisionLogic.DesignPattern.Practice.Singleton::Instance
IL_000a: ret
} // end of method Singleton::.cctor

来源:IT168    作者:王翔    责编:豆豆技术应用

正在加载评论...