单例类的静态“接口”

时间:2017-06-13 09:27:15

标签: c# unity3d singleton

这里的“接口”一词并不是指C#关键字。如果你知道我在这个问题中描述的方法的更好名称,请告诉我。

我在我的一个程序中使用单例。 在编程时,我只是认为将所有单例的方法实现为静态也很好,充当单例的“接口”。

重点是写

int ret = MyClass.GetValue();

而不是

int ret = MyClass.singleton.GetValue();

这就是我所描述的单身人士的“界面”,这就是我如何实现它。

public class MyClass : MonoBehaviour
{
    private static MyClass singleton = null;

    private int theValue = 123;

    private int InstanceGetValue();
    {
        return theValue;
    }

    public static int GetValue()
    {
        if (singleton == null)
            return default(int);
        return singleton.InstanceGetValue();
    }

    private void OnEnable()
    {
        if (singleton == null)
            singleton = this;
    }

    private void OnDisable()
    {
        if (singleton == this)
            singleton = null;
    }
}

所以我的问题是:

我错过了什么可以解释为什么这在使用单身时不常见?

它使每次调用看起来都更好,并且实现起来很简单!为什么这不是使用单身人士的默认方式?

这是Unity代码,但即使您不使用Unity,也可以回答我的问题。您知道,当此对象在此场景中变为活动状态时会自动调用OnEnable,并在对象变为非活动状态时调用OnDisable。

在本主题中,我们不讨论在C#中使用单例是否是一种好习惯。很多很棒的话题已经回答了这个问题。

1 个答案:

答案 0 :(得分:3)

你在这里做的似乎是尝试编写一个适配器以允许访问单例。如果您查看Singleton模式的Wikipedia页面,您会注意到它周围的实现细节指定了两个必需品。

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

你在这里尝试做的是隐藏全局访问,这让我相信你正试图隐藏全局访问点,或者只是想通过从以下内容中排除单例调用来编写更少的代码:{ {1}}

我认为你在这里要问自己的主要问题是你试图实现的两个问题。如果您试图隐藏全局访问点,我建议您首先查看为什么要使用单例,但如果您尝试编写更少的代码,我宁愿质疑为什么要尝试编写更少的代码,如果你没有使用一些难以阅读的编码实践。

编辑:我理解为什么你只想在场景中使用一个实例,但我宁愿完全负责管理生命周期,而不是仅仅尝试利用单例模式。