单例模式是常用的设计模式之一,顾名思义,单例,单个实例,单例模式的特点是,对于使用该模式的类,只会创建一个该类的实例(或者说都对象),内存中至多只有一个对象,从而达到节约系统性能开销的目的。
单例模式举例:1.spring的控制器;2.spring的bean;3.servlet也是单例;4.windows的任务管理器;5:操作系统的文件系统;
单例模式又分为懒汉式,饿汉式,双重检查锁式,枚举式,静态内部类式,其中前两种是最常用的,本文也主要对这两种模式进行探讨。
一.饿汉式
代码如下:
package practice;
/**
*单例模式 饿汉式 非延迟加载,调用效率较高
*/
public class Singleton_hungry {
//私有化无参构造方法
private Singleton_hungry() {
}
//加载该类时对象已经创建完成
private static Singleton_hungry instance=new Singleton_hungry();
//对外提供一个获取对象的方法
public static Singleton_hungry getInstance() {
return instance;
}
}
饿汉式在类加载时就已经创建对象,适合调用较为频繁的,效率较高。
二.懒汉式
代码如下:
package practice;
/**
* 单例模式 懒汉式 延迟加载
*/
public class Singleton_lazy {
//私有化无参构造方法
private Singleton_lazy() {
}
//加载类时不创建对象
private static Singleton_lazy instance;
//调用该方法时未创建对象时再创建对象
public synchronized static Singleton_lazy getInstance() {
if(instance==null) {
instance=new Singleton_lazy();
}
return instance;
}
}
懒汉式在类加载时没有创建对象,而是在调用获取该类对象的方法时检查对象是否已经创建,若没有创建,再创建该类的对象。
三.总结
共同点:
1.两种模式都会私有化无参构造方法;
2.两种模式都是线程安全的;
不同点:
饿汉没有延迟加载,懒汉可以延迟加载,若经常调用,使用饿汉式,效率较高,若不经常调用,使用懒汉式;