关于C#:静态类和单例类desgin模式有什么区别?

What is the difference between static class and singleton class desgin pattern?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Difference between static class and singleton pattern?

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

在单吨类中,我们确保只创建一个对象,而不创建更多对象。

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

这里两个看起来都一样,所以使用创建单吨类有什么用。

在这方面有任何帮助都是很好的。


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

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


在静态类中,没有对象。直接调用静态类上的方法。

然而,在singleton中,有一个对象,它只能有一个实例。

singleton在条件创建资源密集型对象时很有用。对于ex,您的应用程序可能需要连接到远程数据库。您可能希望将其设置为singleton,以限制连接的数量,并确保仅在需要时创建。

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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类的实例,但是i var只创建一次,并且所有实例都"保存在内存中"。

现在更容易理解singleton。singletongarantes使您只有一个类实例(因为它使用静态属性来保留实例的引用并返回它)。因此,它可以用于一次声明一个对象(例如,如果您的对象消耗了太多的资源来创建)


很明显,区别在于,一方面,您在静态上下文中工作,另一方面,您处理的是普通对象实例。我要说的是,这一点的主要后果是,由于静态成员不是继承的,静态类不能从继承或多态性中受益,而单例可以从中受益。通过在静态上下文中工作,你将失去很多Java的对象定向。


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

因此,单例对象可以像普通的非静态对象一样保持信息/状态。最重要的是,singleton被设计成线程安全的,也就是说它有一个同步根对象(通常),可以用来阻止试图执行相同操作的线程。

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