您将如何确保只能创建一个类的一个对象

时间:2015-11-04 06:50:11

标签: c# oop object

在一个采访问题中,我被问到这个问题,我回答说我们可以通过私有构造函数实现这一点,但我不确定。这是对的吗?我想要更多解释和其他方法(如果有的话)来实现这一点。

抱歉,如果这听起来很蠢。我实际上正在学习OO设计,所以存在很多困惑

5 个答案:

答案 0 :(得分:2)

您可能有兴趣查看singleton pattern。查看Jon Skeet关于它的article

  

单例模式是软件中最着名的模式之一   工程。从本质上讲,单身人士是一个只允许一个人的类   要创建的单个实例,通常很简单   访问该实例。

答案 1 :(得分:2)

以下是单身人士的基本实现:

public class Singleton
{
    public static Singleton Instance = new Singleton();

    private Singleton() { }
}

由于私有构造函数,您无法编写此代码:

Singleton singleton = new Singleton();

编译器抱怨:

  

CS0122'Initton.Singleton()'由于其保护级别而无法访问

但是您可以轻松获得这样的单个实例:

Singleton singleton = Singleton.Instance;

答案 2 :(得分:0)

私有构造函数只是答案的一部分。您还需要一个同一个类的静态实例,以及一个getInstance()方法,返回那个懒惰的初始化实例。

这个问题旨在探讨Singleton模式的知识。

https://en.m.wikipedia.org/wiki/Singleton_pattern

答案 3 :(得分:0)

可以使用以下代码提出用于强制执行Singleton模式的完整最终解决方案,请参阅注释以获得解释。

public final class Singleton {

    // A private static variable of the class
    private static final Singleton INSTANCE = new Singleton();

    // A private constructor so that - 
    // Singleton singleton = new Singleton();
    // the above line throws an exception
    private Singleton() {}

    // Finally, a private static method to get the instance 
    // of the class
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

答案 4 :(得分:0)

我知道这是一篇过时的文章,但我认为我可以为以后的访问者节省一些我刚刚遇到的困惑。我不会详细介绍我感到困惑的部分,无论如何您都可能会发现它们。 :)

C#

// Using your class name, not Singleton
public class MyClass
{
    // Public so the instance can be seen
    public static class MyClass _instance = new MyClass();
    // Private constructor so it doesn't create any more instances
    private MyClass() { }
    // The Public Property that intercepts the creation requests
    public MyClass Instance
    {
        get
        {
            if (_instance != null)
                return _instance; // Pass back the single instance already created
            else
            {
                MyClass _instance = new MyClass();
                return _instance;
            }
        }
    }
    // Create the rest of your class
    public int myInt;
    public string myString;
}

// Access it in your program
public MyClass myclass = MyClass._instance;

public Main()
{
    myclass.myString = "This is a string inside a Singleton instance of a class.";
    Console.WriteLine(myclass.myString);
}

编辑:找到了为什么它不起作用。静态实例必须是公共的。