我正在学习 C# 中的 Singleton 设计模式,我以两种方式编写了下面的代码,我想知道哪一种是创建 Singleton 类的正确方法:
public sealed class TranslationHelper
{
// first way
private static readonly TranslationHelper translationHelper = new TranslationHelper();
// second way
public static readonly TranslationHelper translationHelpers = new TranslationHelper(); // Direct call
public static TranslationHelper GetTranslationHelper()
{
return translationHelper;
}
private TranslationHelper()
{
}
}
叫:
TranslationHelper instance = TranslationHelper.GetTranslationHelper();
TranslationHelper ins = TranslationHelper.translationHelpers;
我是初学者,所以我不确定两种方法是否相同。请指导我。
如果您使用的是 .Net 4 或更高版本,则可以像这样使用Lazy<T>
类型:
public sealed class Singleton
{
private static readonly Lazy<Singleton> lazy =
new Lazy<Singleton>(() => new Singleton());
public static Singleton Instance { get { return lazy.Value; } }
private Singleton()
{
}
}
通过将此设计模式与私有构造函数一起使用,可以确保仅在使用类时创建类。这是有保证的,因为
- 它只能由其自身调用,因此不会提前实例化。
Lazy<T>
关键字与private static readonly
lambda 函数一起使用时,现在提供了一种直观清晰的方式来从函数本身中懒惰地创建类的实例。public Singleton Instance
属性提供了一种从类外部访问该单一实例的方法。