如何访问单例类的静态方法?

4

我对单例类有些困惑,以下是我的一些观点:

  1. 单例类可以有静态方法吗?如果可以,那么我们如何调用这些方法?
  2. 静态类和单例类之间的主要区别是什么?

我创建了以下单例类:

 public class Singleton
    {
        private static  Singleton _instance = null;
        private static object chekLock = new object();
        private Singleton()
        {}

        public static Singleton Instance
        {
            get
            {
                lock (chekLock)
                {
                    if (_instance == null)
                        _instance = new Singleton();
                    return _instance;
                }
            }
        }

        public static void StaticAddMethod()
        {
            Console.WriteLine("Add Method");
        }

        public void AddMethod()
        {
            Console.WriteLine("Add Method");
        }
    }

在上述类结构中,我创建了两个方法,一个是静态的,另一个是非静态的。当我尝试访问静态方法时,它会在编译时出现错误。
如何使用单例类的静态方法?

列出您使用 Singleton 的目的可能会有所帮助,因为该类不是 Singleton,它只是一个具有静态方法的类。 - Wysawyg
你是如何尝试访问静态方法的?你应该使用Singleton.StaticAddMethod()。你遇到了什么编译错误? - Kev Hunter
2
如果你正在运行.NET 4,我建议你使用Lazy<T>对象来实现单例模式。它非常简洁明了:http://geekswithblogs.net/BlackRabbitCoder/archive/2010/05/19/c-system.lazylttgt-and-the-singleton-design-pattern.aspx - myermian
6个回答

8

您是如何尝试访问它的?要访问静态方法,您需要使用类型名称:

Singleton.StaticAddMethod();

vs

Singleton.Instance.AddMethod();

请注意,还有更简单的实现单例模式的方式,可以减少锁定等操作。
关于单例和静态之间的区别,单例可能实现一个接口,使您能够将其传递到现有代码中。您还可以(正如您正在做的一样)延迟单例的构建(但仍允许访问不涉及单例实例的静态方法)。但是,确实存在许多静态和单例之间的重叠部分。

关于“更简单的实现单例模式,使用更少的锁定即可达到相同效果”的评论 - 这里是一个很好的资源,其中包括如何使用“synchronized”关键字使其线程安全的简短解释。 - Chris
@chrisf 在C#中,“lock”(根据问题)基本上意思相同。你可以使用一个属性,JIT将其解释为同步,但很少见到它被使用。 - Marc Gravell
啊,我忽略了它是关于C#的那部分。抱歉。 - Chris

3

静态方法可以直接从类型中调用。您不需要创建实例来进行调用。

因此,

Singleton.StaticAddMethod();

Will work

Also change your declaration from

private static  Singleton _instance = null;

为了

private static READONLY  Singleton _instance = new Singelton();

这将使您摆脱所有锁定,因为只能在创建时分配readonly,保护您免受任何可能遇到的锁定问题。;)
public static Singleton Instance        
{            
    get
    {
        return _instance;
    }
}

2

您应该通过以下方式访问静态方法:

Singleton.StaticAddMethod()

或者,如果你已经在Singleton内部,那么只需要:


StaticAddMethod()

区别在于静态方法可以从任何地方访问。实例方法需要您在创建类的实例上调用该方法。对于单例来说,这意味着该类具有实例字段/方法,但是您可以通过静态Instance属性访问唯一的实例。


2

静态方法属于类型本身,而不是类型的实例。因此,您可以像这样调用静态方法:

Singleton.StaticAddMethod()

1

像这样:

Singleton.StaticAddMethod();

Singleton.Instance.AddMethod();

0
关于你的第二个问题,两者之间的一个区别是单例类可以被子类化并以静态类无法参与的多态行为方式参与。

你能给我一个子类化和多态行为的例子吗? - Vijjendra
使用静态类,您可以像这样使用它:MyStaticClass.DoSomething(); 使用单例模式,您可以对其进行子类化并像这样使用它:MyClass.Instance.DoSomething(); - Pedro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接