一)单例模式介绍
单例模式(Singleton Pattern):确保一个类有且只有一个实例,并提供一个全局访问点。
主要特点:
1、构造方法私有化;
2、实例化的变量引用私有化;
3、获取实例的方法共有;
应用场景:
例如:线程池(threadpool)、缓存(cache)、默认设置、注册表(registry)、配置数据、日志对象等等。
二)单例模式-饿汉模式
package com.xm.designpattern.single;
/**
* 单例模式-饿汉模式
* 原理: 不管是否使用,类加载时就初始化好
* 缺点: 非线程安全,只适合单线程使用
* @author ouyangjun
*/
public class HungrySingle {
private HungrySingle hungrySingle = new HungrySingle();
public HungrySingle getInstance(){
return hungrySingle;
}
}
三)单例模式-懒汉模式
package com.xm.designpattern.single;
/**
* 单例模式-懒汉模式
* @author ouyangjun
*/
public class LazySingle {
/**
* 原理: 在需要用到实例的时候才去创建
* 缺点: 非线程安全,只适合单线程使用
* @return
*/
private LazySingle lazySingle = null;
public LazySingle getInstance(){
if (lazySingle==null) {
lazySingle = new LazySingle();
}
return lazySingle;
}
/**
* 原理: 在需要用到实例的时候才去创建
* 缺点: 线程安全,可多线程使用,但比较消耗性能,因为不是所有情况都需要同步
* @return
*/
private LazySingle lazySingleSafe = null;
public synchronized LazySingle getInstanceSafe(){
if (lazySingleSafe==null) {
lazySingleSafe = new LazySingle();
}
return lazySingleSafe;
}
}
四)单例模式-懒汉模式,双重安全校验
package com.xm.designpattern.single;
/**
* 单例模式-懒汉模式,双重安全校验
* 原理: 当实例为空的时候,先锁定,再创建实例,再放开锁,原理上是没问题的,可使用
* 缺点: 多重校验,容易出错
* @author ouyangjun
*/
public class DoubleLazySingle {
private DoubleLazySingle doubleLazySingle = null;
public DoubleLazySingle getInstance(){
if (doubleLazySingle==null) {
synchronized(DoubleLazySingle.class) {
if (doubleLazySingle==null) {
doubleLazySingle = new DoubleLazySingle();
}
}
}
return doubleLazySingle;
}
}
五)单例模式-内部类实现(推荐使用)
package com.xm.designpattern.single;
/**
* 单例模式-内部类实现
* 原理: 单列初始化不会加载,在调用getInstance()方法时才进行加载,推荐使用
* @author ouyangjun
*/
public class InternalClassSingle {
private static class InternalClassSingleHolder {
private static InternalClassSingle internalClassSingle = new InternalClassSingle();
}
public InternalClassSingle getInstance() {
return InternalClassSingleHolder.internalClassSingle;
}
}
六)单例模式-枚举实现(推荐使用)
简单案例:
public enum EnumSingleton {
INSTANCE;
public EnumSingleton getInstance(){
return INSTANCE;
}
}
完整案例:
public class DBLinkUtils {
//私有化构造函数
private DBLinkUtils() {}
//定义一个静态枚举类
static enum SingletonEnum {
//创建一个枚举对象,该对象天生为单例
INSTANCE;
private DBLinkUtils dblink;
// 私有化枚举的构造函数
private SingletonEnum() {
dblink = new DBLinkUtils();
}
public DBLinkUtils getInstnce(){
return dblink;
}
}
// 对外暴露一个获取DBLinkUtils对象的静态方法
public static DBLinkUtils getInstance(){
return SingletonEnum.INSTANCE.getInstnce();
}
}
识别二维码关注个人微信公众号
本章完结,待续,欢迎转载!
本文说明:该文章属于原创,如需转载,请标明文章转载来源!