Design patterns 不同的singelton实现
当我被介绍到singleton模式时,这是实现它的方法:Design patterns 不同的singelton实现,design-patterns,singleton,Design Patterns,Singleton,当我被介绍到singleton模式时,这是实现它的方法: public class MySingleton { private MyStingleton instance; private MySingleton() { //constructor } public static MySingleton GetInstance() { if(instance== null) {
public class MySingleton
{
private MyStingleton instance;
private MySingleton()
{
//constructor
}
public static MySingleton GetInstance()
{
if(instance== null)
{
instance = new MySingleton();
}
return instance;
}
}
与此相比,这样做的优势是什么:
public class MySingleton
{
public static readonly MyStingleton Instance = new MySingleton();
private MySingleton()
{
//constructor
}
}
第一个示例不是线程安全的。您可以看看。这两种单例实现都是不安全的,我认为使用第二种实现比使用第一种实现没有任何好处 您可能应该查看以下链接:其中列出了许多单例实现,并解释了每种实现的优缺点 最后一个正确的单例是:
public sealed class Singleton
{
Singleton()
{
}
public static Singleton Instance
{
get
{
return Nested.instance;
}
}
class Nested
{
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Nested()
{
}
internal static readonly Singleton instance = new Singleton();
}
}
在第一种方法中,在调用GetInstance静态方法之前不会创建实例。您可以在调用此方法时创建实例 在第二个例子中,实例是一个常量,在概念上是不同的
用于使用第一个,是我一直看到的模式,您可以控制实例的创建时间。如何“避免全局数据、不稳定的设计、隐藏的依赖项,以及将应用程序中的每个类耦合到单个实例”?请注意,文章顶部有一个链接,指向文章的更新版本,还有一个使用
Lazy
的额外模式。嘿,Jon,我自己也错过了这个链接,这是.NET4.0中非常好的功能。通过回答问题了解更多信息总是很有趣:)@Petar啊,可能是的,可能我把它和instance=null混淆了,而不是instance=new(..),这是不安全的。