public class MySingletonClass
{
public MySingletonClass()
{
_mySingletonObj = Instance();
}
public static MySingletonClass Instance()
{
if (_mySingletonObj == null)
{
lock (typeof(lockObject))
{
if (_mySingletonObj == null)
_mySingletonObj = new MySingletonClass();
}
}
return _mySingletonObj ;
}
}
MySingletonClass _myObj = new MySingletonClass();
这是公共建设者的单身人士..?
由于
答案 0 :(得分:14)
不,它不是单身人士 - 任何人都可以创建它的多个实例。 (暂且不谈已经提出的堆栈溢出问题,以及你使用双重检查锁定的事实。)
单例类型的一个显着特征是它可以防止构造自身的多个实例。
来自维基百科Singleton Pattern文章:
在软件工程中,单身人士 模式是一种设计模式 用来限制a的实例化 类到一个对象。
来自Ward Cunningham's pattern repository:
Singleton是两者的组合 基本属性:
- 确保一个类只有一个实例
- 提供全球访问权限
显然,你的单身人士无法满足这两种定义。
请参阅我的singleton article了解实际情况。
答案 1 :(得分:4)
由于公共构造函数,发布的代码不能作为单例工作,但除此之外,代码存在许多缺陷和问题:
以下是您的代码的固定版本:
public class MySingletonClass
{
private readonly object _mySingletonLock = new object();
private volatile MySingletonClass _mySingletonObj;
private MySingletonClass()
{
// normal initialization, do not call Instance()
}
public static MySingletonClass Instance()
{
if (_mySingletonObj == null)
{
lock (_mySingletonLock)
{
if (_mySingletonObj == null)
_mySingletonObj = new MySingletonClass();
}
}
return _mySingletonObj;
}
}
MySingletonClass _myObj = MySingletonClass.Instance();
答案 2 :(得分:3)
查看Dofactory处的.NET优化代码部分。这使IMO成为最佳实施方案。另请查看该站点以了解C#中的其他设计模式实现。
答案 3 :(得分:1)
构造函数应该是私有的
答案 4 :(得分:1)
您也可以尝试创建静态只读单例...而不是锁定它。
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
static Singleton()
{
}
private Singleton()
{
}
/// <summary>
/// The public Instance property to use
/// </summary>
public static Singleton Instance
{
get { return instance; }
}
}
答案 5 :(得分:0)
Singleton的本质是提供:
Singleton的实现基于使用方法(或.NET中的属性)创建一个类,如果尚不存在,则创建此类的实例。类的构造函数必须是私有的,以防止其他初始化方式。此外,Singleton必须在多线程应用程序中小心使用,因为在一个时间点,两个线程可能会创建两个不同的实例(违反单例模式)。
您可以找到更多详细信息和示例here.