可以在没有私有构造函数的情况下制作单例吗?

时间:2018-02-01 23:41:41

标签: c# singleton

    private static PostalCodeInfoTable postalCodeInfoTable = new PostalCodeInfoTable();

    public static PostalCodeInfoTable GetInstance() { return postalCodeInfoTable; }


    public PostalCodeInfoTable()
    {
        db = new GetConnectionString());
    }

我使用GetInstance()创建一个PostalCodeInfoTable,然后我使用一个成员函数来加载我在这里没有显示的数据,然后我再次使用GetInstance然后数据已经预先加载,所以它似乎我们有一个单身,但我理论上混淆了为什么我们可以用公共构造函数做到这一点

4 个答案:

答案 0 :(得分:6)

如果没有私有构造函数,就无法生成单例!

如果一个类有一个公共构造函数,那么任何人都可以随时创建它的一个实例,这将使它不是一个单例。

为了使它成为单身人士,只能有一个实例。

来自wikipedia

  

单例模式的实现必须:

     
      
  1. 确保只存在单例类的一个实例;
  2.   
  3. 并提供对该实例的全局访问权。
  4.         

    通常,这可以通过以下方式完成:

         
        
    1. 声明该类的所有构造函数都是私有的;
    2.   
    3. 并提供一个返回对实例的引用的静态方法。
    4.   

答案 1 :(得分:2)

单例只不过是一个预期只有一个实例的类的实例。通常,您可以通过将构造函数设置为私有并使用静态成员来访问它来隐藏构造函数,从而确保应用程序中只能存在单个实例。 由于构造函数是公共的,您仍然可以创建一个新实例。让它不再是一个单身人士'根据定义,但这并不意味着它不能表现为一个。

答案 2 :(得分:1)

您在此处创建的是一个静态变量(PostalCodeInfoTable.postalCodeInfoTable),只能通过静态方法(PostalCodeInfoTable.GetInstance())进行访问。

PostalCodeInfoTable实例由TypeConstructor创建,在运行时常量声明之外很少使用。

公共构造函数?那一个是完全无关紧要的。我不确定它有什么用途。它不会影响静态字段的内容。事实上,它所做的就是打破单一模式:

var temp1 = PostalCodeInfoTable.GetInstance();
var temp2 = new PostalCodeInfoTable();

//This will return false, as they are not the same instances
object.ReferenceEquals(temp1, temp2);

答案 3 :(得分:1)

单例模式的实现必须

  • 确保只存在单例类的一个实例;
  • 提供对该实例的全局访问权。

通常,这可以通过以下方式完成:

  • 声明该类的所有构造函数都是私有的 ;
  • 提供一个返回对实例的引用的静态方法。

实例通常存储为私有静态变量;在初始化变量时,在首次调用静态方法之前的某个时刻创建实例。

正确的例子:

public class PostalCodeInfoTable{

    //.........

    private static PostalCodeInfoTable Instance = new PostalCodeInfoTable();

    private PostalCodeInfoTable() {
        db = new GetConnectionString();
    }

    public static PostalCodeInfoTable GetInstance() {
        return Instance;
    }
}