天天看点

单例模式和静态类

一、静态类和singleton之间的区别

1)static类有更好的访问效率(because static methods are bonded on compile time);

2)static方法不能重写(override) , singleton可以,我们可以继承一个singleton的类, 然后重写它;

3)singleton比static class更容易测试. (哪个容易模拟(mock), 哪个就容易测试)。 singleton很容易用JUnit测试, 因为你能够传递mock对象, 当singleton需要的时候(作为方法参数或者构造函数参数);

4)如果你的需求是维护(maintain)状态, 那么singleton比static class更好 , 如果使用static class会出现一些问题;

5)singleton支持延迟加载 , 而static class 则不支持这样的特性 , 在重量级的对象, 延迟加载就显得非常重要;

6)在一些依赖注入(Dependency injection framework)的框架 , 它能够很好的管理singleton对象 . 例如Spring;

7)singleton 对于static class 主要的优点是更加面向对象 . 对于singleton可以使用继承(Inheritance)和多态(polymorphism)来继承一个基类, 实现一个接口, 提供不同功能的实现. 例如 , Java中java.lang.Runtime ,该类就是一个singleton的, 调用getRuntime(),基于不同的JVM ,返回不同的实现对象,  针对一个一个JVM,确保只有一个Runtime对象 , 如果使用static class就不能很好的来实现这样的功能了;

8)垃圾回收方式。单例模式产生的唯一实例会一直驻留在内存中;而静态类随着静态方法的执行完毕而及时回收。

二、静态类和单例模式的使用场景

1、单例模式

1)不存在比较复杂的事务管理,用单例比较好,eg:DAO初始化比较占系统资源的,如果用静态类方法来取,会不断地初始化和释放;

2)记录系统日志;

3)当要控制某个类在内存中实例个数只能有一个时;

4)只能多线程使用,那么多线程中实例变量就是多线程共享的,eg:windows的任务管理器,整个windows只需要一个实例;

5)在应用程序中,服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。管理过程中,一些中间耗时检测过程不用重复执行,带来响应速度的优化。不是必须这样,用普通类也一样实现,每次应用前实例化,用完销毁,相对来说性能差一些而已。

2、静态类

1)工具集HELPER;

2)使用静态类成员变量维护一个状态,使得可以让多实例共享这个变量,eg:统计使用;

3)可以用它来实现一些类似缓存的功能。

    如果你的singleton不需维持任何状态, 仅仅是提供全局的访问 , 这个时候就适合用静态类 , 这样速度更快, 因为static bind在编译期间(compile during)。记住不经意维持子类的状态 , 尤其是在并发的情况下, 多个线程并发修改,这容易导致不容易发现的race condition 关于race condition .

三、两者相似点:内存占用相同。

继续阅读