1.介紹
單例模式:是一種常用的軟件設(shè)計(jì)模式,中心思想:一個(gè)類保證只有一個(gè)實(shí)例会通。
2.使用場(chǎng)景
有些對(duì)象我們只需要一個(gè)口予,如果一個(gè)全局使用的類頻繁地創(chuàng)建與銷毀,這樣會(huì)造成很多io的消耗涕侈。例如我們?cè)趯?shí)際項(xiàng)目中:對(duì)于配置文件沪停、工具類、線程池裳涛、緩存木张、日志對(duì)象等。這些對(duì)象端三,我們都是需要保證其實(shí)例只有一個(gè)舷礼,所以需要單例模式的構(gòu)建。
學(xué)習(xí)過Spring的同學(xué)技肩,應(yīng)該都知道在Spring中Bean的scope(作用范圍)參數(shù)的缺省設(shè)定值就是單例模式且轨。每個(gè)bean定義只生成一個(gè)對(duì)象實(shí)例,每次getBean請(qǐng)求獲得的都是這個(gè)唯一實(shí)例。
3.Java代碼實(shí)現(xiàn)
a.單例模式--餓漢模式的創(chuàng)建
/**
* 單例模式singleton
* 餓漢模式EagerSingleton
* 特點(diǎn):加載類時(shí)比較慢虚婿,但是運(yùn)行時(shí)獲取對(duì)象的速度比較快旋奢,線程安全。
*/
public class EagerSingleton {
//1.將構(gòu)造方法私有化然痊,外界無法直接創(chuàng)建多個(gè)實(shí)例
private EagerSingleton() {
}
//2.創(chuàng)建類的唯一實(shí)例至朗,使用private static修飾,外界不能直接訪問
private static EagerSingleton instance = new EagerSingleton();
//3.提供一個(gè)用于獲取唯一實(shí)例的方法剧浸,使用public static修飾
public static EagerSingleton getInstance() {
return instance;
}
}
b.單例模式--懶漢模式的創(chuàng)建
package com.hugo.designpattern;
/**
* 單例模式singleton
* 懶漢模式LazySingleton
* 特點(diǎn):加載類時(shí)比較快锹引,但是運(yùn)行時(shí)獲取對(duì)象的速度比較慢,線程不安全唆香。
*/
public class LazySingleton {
//1.將構(gòu)造方法私有化嫌变,外界無法直接創(chuàng)建多個(gè)實(shí)例
private LazySingleton() {
}
//2.創(chuàng)建類的唯一實(shí)例,使用private static修飾躬它,外界不能直接訪問
private static LazySingleton instance;
//3.提供一個(gè)用于獲取唯一實(shí)例的方法腾啥,使用public static修飾
public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
c.餓漢模式和懶漢模式的區(qū)別
因?yàn)?strong>餓漢模式在加載類時(shí),就直接new一個(gè)唯一實(shí)例,所以加載時(shí)倘待,速度會(huì)比較慢疮跑;另一方面,正是由于類加載時(shí)就創(chuàng)建了這個(gè)唯一實(shí)例凸舵,所以運(yùn)行時(shí)祖娘,獲取對(duì)象實(shí)例,速度會(huì)比較快啊奄。線程安全渐苏。
因?yàn)?strong>懶漢模式在加載類時(shí),并沒有直接new一個(gè)唯一實(shí)例增热,所以速度會(huì)比較快整以;另一方面胧辽,運(yùn)行時(shí)峻仇,獲取對(duì)象實(shí)例,對(duì)象存在就直接返回邑商,不存在就new一個(gè)唯一實(shí)例摄咆,速度會(huì)比較慢。線程不安全人断。