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

问题描述 投票:0回答:5
    private static PostalCodeInfoTable postalCodeInfoTable = new PostalCodeInfoTable();

    public static PostalCodeInfoTable GetInstance() { return postalCodeInfoTable; }


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

我使用 GetInstance() 创建一个 PostalCodeInfoTable,然后使用成员函数加载一些此处未显示的数据,然后再次使用 GetInstance,然后数据已经预加载,所以看起来我们有一个单例,但我在理论上很困惑为什么我们可以使用公共构造函数来做到这一点

c# singleton
5个回答
8
投票

没有私有构造函数就无法创建单例!

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

为了使其成为单例,只能有一个实例。

来自维基百科

单例模式的实现必须:

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

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

  1. 将类的所有构造函数声明为私有;
  2. 并提供一个返回实例引用的静态方法。

2
投票

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


1
投票
必须

确保单例类只存在一个实例;
  • 提供对该实例的全局访问。
  • 通常,这是通过以下方式完成的:

  • 将类的所有构造函数声明为私有; 提供返回实例引用的静态方法。
  • 实例通常存储为私有静态变量;该实例是在变量初始化时创建的,在首次调用静态方法之前的某个时刻创建。

正确示例:

public class PostalCodeInfoTable{ //......... private static PostalCodeInfoTable Instance = new PostalCodeInfoTable(); private PostalCodeInfoTable() { db = new GetConnectionString(); } public static PostalCodeInfoTable GetInstance() { return Instance; } }



1
投票

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



0
投票

public enum PostalCodeInfoTable { Instance }

然后您可以使用以下方式访问此实例:

var postalCodeInfoTable = PostalCodeInfoTable.Instance;

枚举中的 Instance 值隐式表示 PostalCodeInfoTable 的单个实例。 C# 运行时保证枚举值仅初始化一次,从而使其成为实现单例的线程安全方式。

© www.soinside.com 2019 - 2024. All rights reserved.