静态类和单例类设计模式有什么区别?

时间:2011-07-12 14:59:59

标签: c# .net design-patterns c#-3.0

  

可能重复:
  Difference between static class and singleton pattern?

我无法理解b / w静态类和单例类的区别。

在单吨课程中,我们确保只创建一个对象,不再创建任何对象。

在静态类中也没有必要创建一个对象,我们可以使用静态类名直接调用属性和方法。

这两个看起来都是一样的,所以我们使用创建单吨课程。

对此的任何帮助都会很棒。

5 个答案:

答案 0 :(得分:2)

在Static类中,没有对象。您可以直接在静态类上调用方法。

在Singleton中,有一个对象,但只能有一个实例。

Singleton在条件创建资源密集型对象时非常有用。例如,您的应用程序可能需要连接到远程数据库。您可能希望将其设置为单例以限制连接数,并确保仅在需要时创建它。

静态类和方法更像是实用程序函数,可以在需要时调用它们。

答案 1 :(得分:2)

使用Singleton,我们可以确保只创建一个类(对象)的一个实例。当对象的创建成本很高时,这非常有用,而且只需要一个。

另一方面,静态类不能创建类的实例。当方法不低于给定对象,而是作用于现有对象时,这是合适的。

答案 2 :(得分:1)

显然,不同之处在于,一方面,您在静态上下文中工作,另一方面,您正在处理普通对象实例。我要说的主要结果是因为静态成员不是继承的,所以静态类不能从单例可以继承或多态中受益。通过在静态上下文中工作,您将失去许多Java的面向对象。

答案 3 :(得分:1)

首先让我们看一个解释静态/实例的例子(代码在as3中,但在任何语言中都是相同的原则)

class Blob {
   private var i:int=0;

   public function Blob() {
      i++;
      trace("I value : " + i);
   }
}
new Blob();
new Blob();

------
output
I 1
I 1

你有两个Blob类实例,每次都创建i var。

class StaticBlob {
  private static var i:int =0;

  public function StaticBlob() {
    i++;
    trace("I value : " + i);
  }
}
new StaticBlob();
new StaticBlob();

--------
output

I 1
I 2

你的StaticBlob类也有2个实例,但是我只创建了一次并且为所有实例“保留在内存中”

现在了解Singleton更容易。 Singleton保证您只拥有一个类的一个实例(因为它使用静态属性来保留实例的引用并将其返回)。 因此,可以使用一次对象进行实例化(例如,如果您的对象消耗太多资源来创建)

答案 4 :(得分:0)

单例类与静态类非常不同,单例类可以包含静态和非静态成员/属性/方法。

因此,单个对象可以像普通的非静态对象一样持久保存信息/状态。最重要的是,单例设计为线程安全,即它具有一个同步根对象(通常),可用于阻止尝试执行相同操作的线程。

静态类只能包含静态成员/属性/成员,因此无法保持线程安全,无法锁定静态对象。