【发布时间】:2015-03-30 09:28:16
【问题描述】:
我一直在查看一些旧项目的一些代码,并在那里发现了一个单例。使用单例是必需的,我正在考虑一种方法让它在使用时看起来“更简单”。
我发现,像访问静态类一样访问方法和属性会更容易。所以我基本上使用静态方法实现了一个单例,以跳过使用GetInstance() 的要求。这就是我实现它的方式:
public class ExampleSingleton
{
string someRequiredValue = "This is an example.";
/// <summary>
/// Private Constructor
/// </summary>
private ExampleSingleton() { }
private static volatile ExampleSingletoninstance;
/// <summary>
/// !!! PRIVATE !!!
/// Instance Property.
/// Returns the instance of this singleton.
/// (ThreadSafe)
/// </summary>
private static ExampleSingleton Instance
{
get
{
if (instance == null)
{
lock (_lock)
{
if (instance == null)
{
instance = new ExampleSingleton();
}
}
}
return instance;
}
}
/// <summary>
/// Example field contains a value that should be
/// accessible from outside.
/// </summary>
public static string SomeRequiredField
{
get
{
// Here you do the job you would have to do "outside"
// of the class normally.
return ExampleSingleton.Instance.someRequiredValue;
}
}
// Helper for a secure thread synchronisation.
private static object _lock = new object();
}
所以当你想访问单例值时,你可以这样做:
// Access the values like this
string requiredField = ExampleSingleton.SomeRequiredField;
// Instead of this
string requiredField = ExampleSingleton.Instance.SomeRequiredField;
// Or even this
string requiredField = ExampleSingleton.GetInstance().SomeRequiredField;
我在这里违反了单例模式的原则吗?它基本上仍然是单例模式,但获取实例的工作是在内部完成的。这个例子的缺点是什么?还有其他专业的吗?
谢谢
【问题讨论】:
-
好问题。迫不及待地想看到人们来到这里把它放火,因为它是主观的......
-
@Orace 我相信,如果我问这种方法会出现什么问题,它不再是主观的了吗?
-
我不会给出论据来扼杀你的问题 :o)
-
如果你想节省一些输入,你可以这样做: private SingletonExample singletonExample = SingletonExample.Instance;在任何需要访问 Singleton 的地方,然后通过 singletonExample.SomeRequiredField 调用其属性;这不是一种常见的做法,而是一种可能性。
标签: c# design-patterns singleton