第一章:Java设计模式-单例模式

一)单例模式介绍

单例模式(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();
    }
}

 

识别二维码关注个人微信公众号

本章完结,待续,欢迎转载!
 
本文说明:该文章属于原创,如需转载,请标明文章转载来源!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值