单一模式与公共构造函数

时间:2009-09-16 09:01:10

标签: c# singleton

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();

这是公共建设者的单身人士..?

由于

6 个答案:

答案 0 :(得分:14)

不,它不是单身人士 - 任何人都可以创建它的多个实例。 (暂且不谈已经提出的堆栈溢出问题,以及你使用双重检查锁定的事实。)

单例类型的一个显着特征是它可以防止构造自身的多个实例。

来自维基百科Singleton Pattern文章:

  

在软件工程中,单身人士   模式是一种设计模式   用来限制a的实例化   类到一个对象。

来自Ward Cunningham's pattern repository

  

Singleton是两者的组合   基本属性:

     
      
  • 确保一个类只有一个实例
  •   
  • 提供全球访问权限
  •   

显然,你的单身人士无法满足这两种定义。

请参阅我的singleton article了解实际情况。

答案 1 :(得分:4)

由于公共构造函数,发布的代码不能作为单例工作,但除此之外,代码存在许多缺陷和问题:

  • 公共构造函数调用Instance,它调用公共构造函数,调用Instance,调用..... stack overflow nowinent
  • 公共构造函数每次调用时都返回一个新对象,在后续请求时,不能用相同的对象引用替换返回的结果。换句话说,单身公共构造函数打破了模式。
  • 您不应泄漏锁定对象,在您的情况下,您锁定对象的类型。不要这样做,而是锁定私人对象。

以下是您的代码的固定版本:

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.