单例与静态类

单例模式

单例模式指的是在应用整个生命周期内只能存在一个实例。单例模式是一种被广泛使用的设计模式。他有很多好处,能够避免实例对象的重复创建,减少创建实例的系统开销,节省内存。

静态类

静态类就是一个类里面都是静态方法和静态field,构造器被private修饰,因此不能被实例化。Math类就是一个静态类。

单例与静态类的区别

  • 首先单例模式会提供给你一个全局唯一的对象,静态类只是提供给你很多静态方法,这些方法不用创建对象,通过类就可以直接调用;

  • 单例模式的灵活性更高,方法可以被override,因为静态类都是静态方法,所以不能被override;

  • 如果是一个非常重的对象,单例模式可以懒加载,静态类就无法做到;

那么时候时候应该用静态类,什么时候应该用单例模式呢?首先如果你只是想使用一些工具方法,那么最好用静态类,静态类比单例类更快,因为静态的绑定是在编译期进行的。如果你要维护状态信息,或者访问资源时,应该选用单例模式。还可以这样说,当你需要面向对象的能力时(比如继承、多态)时,选用单例类,当你仅仅是提供一些方法时选用静态类。

例子

using System;

class SingletonHungary
{
    private static SingletonHungary singletonHungary = new SingletonHungary();
    //将构造器设置为private禁止通过new进行实例化
    private SingletonHungary()
    {
        Console.Write("SingletonHungary !");
    }
    public static SingletonHungary getInstance()
    {
        return singletonHungary;
    }
}
class Program
{
     static void Main(string[] args)
      {
          int i = 0;
          while (i++ < 10)
          {
              Console.WriteLine(i);
              Thread.Sleep(1000);
          }
          SingletonHungary.getInstance();
    }
}
运行结果

从结果来看,饿汉式本来就自带延迟加载的属性,只有在访问getInstance方法才会去初始化 SingletonHungary 并创建实例。那搞个懒汉式出来干啥呢,是因为延迟加载是有前提条件的,如果在 getInstance 之前访问了别的静态成员,或者用了反射等等其他满足初始化的条件,类就提前加载了,导致实例化提前,违背了需求。因此,为了达到延迟实例化的目的,有两种方法。其一就是换成懒汉式的写法,不将单例的创建放在静态成员的初始化中,避免了类加载时机带来的影响。其二是仍然采用饿汉式,不过从设计上避免类的提前加载。

参考
到底是用"静态类"还是单例

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容