我们为什么要使用Singleton?

时间:2018-01-21 14:18:23

标签: c# unity3d singleton

我经过长时间的休息后开始编程。按照教程,遇到了Singleton Design Pattern。我想知道在什么样的情况下使用单例模式。特别是在游戏开发中。

4 个答案:

答案 0 :(得分:3)

Singleton模式可能是很久以前Gang of Four提出的最着名和最滥用的模式。

许多开发人员现在将单身人士视为一种反模式。 sinetons带来的最重要的问题可能是允许某些不允许它的类的全局访问。简而言之,它可能违反封装。与此同时,并不是因为这种模式很糟糕,而是它的误用。

强烈建议您查看Game Programming Patterns以获取更多信息。对于任何级别的程序员来说,这本书都是一本很好的书。

请注意,服务定位器模式作为作者建议的替代方案之一,有争议的是反模式。我仍然怀疑如何避免单身人士,但我还没有找到解决方案。

答案 1 :(得分:3)

Singleton设计模式解决了所有这些问题。使用Singleton设计模式,您可以:

  • 确保只创建一个类的一个实例
  • 提供对象的全局访问权限
  • 将来允许多个实例,而不会影响单例类的客户端

答案 2 :(得分:3)

当我们想要确定您的类的实例只创建一次时,使用

Singleton Patern。 想象一下你有这两个类的情况:

    public class MessageBuilder {

    public MessageBuilder() { }

        public string BuildMessage(string message) {
            return message;
        }
    }

    public class MessageDisplayer
    {

        public MessageDisplayer() { }

        public void DisplayErrorMessage(string message)
        {
            MessageBuilder builder = new MessageBuilder();
            Console.Write(builder.BuildMessage("Error message"));
        }

        public void DisplaySuccessMessage(string message)
        {
            MessageBuilder builder = new MessageBuilder();
            Console.Write(builder.BuildMessage("Success message"));
        }
    }

一个类包含一些用于构建消息的逻辑,另一个用于显示消息。但正如您在类MessageDisplayer的方法中看到的那样,我们必须创建两次MessageBuilder的实例。让我们重写一下,因为Singleton Patern:

public class MessageBuilder
{
    private static readonly MessageBuilder instance = new MessageBuilder();

    private MessageBuilder() { }

    public static MessageBuilder Instance
    {
        get 
        {
            return instance; 
        }
    }

    public string BuildMessage(string message)
    {
        return message;
    }
}

public class MessageDisplayer
{

    public MessageDisplayer() { }

    public void DisplayErrorMessage(string message)
    {
        MessageBuilder builder = MessageBuilder.Instance;
        Console.Write(builder.BuildMessage("Error message"));
    }

    public void DisplaySuccessMessage(string message)
    {
        MessageBuilder builder = MessageBuilder.Instance;
        Console.Write(builder.BuildMessage("Success message"));
    }
}

现在你只会创建MessageBuilder一次的实例,并且在下一次调用属性Instance时它不会创建新实例,但只返回一个存储在私有变量{{1 }}。

答案 3 :(得分:2)

Singleton(并且它不与C#绑定,它是一个OO设计模式)是您希望在整个应用程序中只允许创建一个类的一个实例。 有关单身人士和游戏编程模式的详细信息here