java常见设计模式之---单例模式
1、单例模式简介
单例模式(Singleton Pattern)是一个比较简单的模式,其原始定义如下:Ensure a class has only one instance, and provide a global point of access to it. 即确保只有一个实例,而且自行实例化并向整个系统提供这个实例。
因程序需要,有时我们只需要某个类只保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。事实上,这些应用都或多或少具有资源管理器的功能。
总之,选择单例模式就是为了避免不一致状态。
应用场景举例
1)、spring中的单例模式:在spring中每个bean都是单例的,这样做的好处是Spring容器可以管理这些bean的生命周期,由spring容器来决定实例的创建、销毁、销毁后的处理等等问题。如果采用非单例模式,则Bean初始化后的管理交给J2EE容器了,Spring容器就不在跟踪管理Bean的生命周期了。
2)、多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。。
3)、操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。
4)、应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加
5)、Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源
2、单例模式的特点
包括下面几个部分的简单记忆”3125“
3和1一起记忆,即三个一
单例模式只能有一个实例,
单例类必须创建自己的唯一实例
单例类必须向其他对象提供这一实例
综上所述,单例模式就是为确保一个类只有一个实例,并为整个系统提供一个全局访问点的一种方法。
2即是指2种实现方式:懒汉式和 饿汉式
5即是指五种经典实现
有两种场景可能导致非单例的情况
场景一:如果单例由不同的类加载器加载,那便有可能存在多个单例类的实例
场景二:如果 Singleton 实现了 java.io.Serializable 接口,那么这个类的实例就可能被序列化和反序列化。
3、单例模式和静态类
静态类也可以实现一个类只有一个对象,这又和单例模式有什么区别呢?
单例可以继承和被继承,方法可以被重写(override),但是静态方法不行。
静态方法中产生的对象会在执行后被释放,进而被GC所清理,不会一直存在于内存中。
静态类会在第一次运行时初始化(饿汉式也这样),单例模式可以有其他选择,如立即加载(饿汉式)和延迟加载(懒汉式)
基于上面两条,单例模式往往存在于DAO层,如果反复的初始化和释放会占用很多系统资源,而使用单例模式将其加载于内存中可以节省资源开销。
单例模式容易测试
立即加载 :