要成为一个合格的程序猿,程序设计的思维那是必不可少的。今天来介绍一下java设计模式中最简单,也是最常用的设计模式,单例模式。
在java中,每个自定义类都可以有无数个对象,而采用单例能极大的利用现有资源从而减少系统资源的浪费。
单例模式的应用场景非常广泛,
如:数据库连接池的设计就是采用单例,
servlet编程中每个servlet也是单例,
Application也是单例的典型应用,
在Spring中每个bean默认也是单例,
springmvc中 控制器对象也是单例等等。
单例模式有五种实现方式,最常用的有两种,饿汉模式和懒汉模式,其它有双重检测锁模式,静态内部类模式以及枚举类模式实现
饿汉模式:线程安全,调用效率高,不能延迟加载
package com.panda.singleton;
/**
* 饿汉模式
* 线程安全,调用效率高,不能延迟加载
* @author Administrator
*/
public class EhanSingleton {
private EhanSingleton(){};
private static final EhanSingleton instance = new EhanSingleton();
public static EhanSingleton getInstance(){
return instance;
}
}
懒汉模式:
package com.panda.singleton;
/**
* 懒汉模式
* 线程安全,调用效率低,延迟加载
* 使用同步方法防止并发时产生多次示例
* @author Administrator
*/
public class LhanSingleton {
private LhanSingleton(){};
private static LhanSingleton instance;
public static synchronized LhanSingleton getInstance(){
if(instance == null){
instance = new LhanSingleton();
}
return instance;
}
}
双重检测锁模式:
package com.panda.singleton;
/**
* 双重检测锁模式
* 线程安全,调用效率高,能延迟加载
* 由于JVM底层调用模型原因可能会出错,不建议使用
* @author Administrator
*/
public class SingletonDemo1 {
private SingletonDemo1(){};
private static SingletonDemo1 instance;
public static SingletonDemo1 getInstance(){
if(instance == null){
SingletonDemo1 sd;
synchronized(SingletonDemo1.class){
sd = instance;
if(sd == null){
synchronized(SingletonDemo1.class){
if(sd == null){
sd = new SingletonDemo1();
}
}
instance = sd;
}
}
}
return instance;
}
}
静态内部类模式:
package com.panda.singleton;
/**
* 静态内部类模式
* 线程安全,调用效率高,能延迟加载
* @author Administrator
*/
public class SingletonDemo2 {
private SingletonDemo2(){}
private static class Singleton{
private static final SingletonDemo2 instance = new SingletonDemo2();
}
public static SingletonDemo2 getInstance(){
return Singleton.instance;
}
}
枚举类模式:
package com.panda.singleton;
/**
* 饿汉模式
* 线程安全,调用效率高,不能延迟加载
* @author Administrator
*/
public enum SingletonDemo3 {
instance;
//可以写自定义方法实现各自功能
}
单例模式的实现方法就有这五种,如何选择应根据现实情况需要而定,比如当类的占用资源小且不需要延迟加载时应该选用枚举类模式,而当类的占用资源大需要延迟加载时应该选用静态内部类模式实现。