一、單例模式構建原理分析:
我們平時在開發過程中經常會創建多個實例,那是因為在我們new class中
public class Starving {
//這個位置存在一個默認的構造方法,只要有這個默認構造方法,就可以創造多個實例
}
而我們單例模式只允許獲取一個實例,那怎么辦呢?
1.修改默認的構造方法
2.我們把默認的構造方法設置為私有的
3.一旦創建為私有的,那么外界就無法通過構造方法創建實例,就避免創建多個實例
新的問題就來了,單例模式要保證至少而且只有一個實例,而外部無法創建?
1.自己創建一個實例,自己可以調用我們自己私有的構造方法來創建一個類的實例
例如:Starving instance = new Starving();
2.創建實例以后,我們怎么把這個實例提供給外部呢?
一般我們要獲取成員通過對象.的形式獲取,而現在外部根本無法去獲取這個對象
static Starving instance = new Starving();
通過static變為類的成員,我們就可以通過類名的方式去訪問這個成員。
Starving star1 = Starving.instance; //這種方式獲取實例
Starving star2 = Starving.instance; //這種方式獲取實例
提供一個用於獲取實例的方法
//需要注意的是,我們這個方法屬於對象,不是類方法
public Starving getInstance(){
return instance;
}
那么我們可以把他變為私有的靜態成員類方法
public static Starving getInstance(){
return instance;
}
所以,外部就可以以這種方式訪問到
Starving star = Starving.getInstance();
二、創建單例模式
創建單例有兩種模式,一種是餓漢模式,一種是懶漢模式,具體代碼如下:
/**
* 單例模式 餓漢模式
* @author <wpda
* 應用場合:只需要一個就足夠了
* 作用:保證整個程序中某個實例有且只有一個
*/
public class Starving {
//1.將構造方法私有化,不允許外部直接創建對象
private Starving(){
}
//2.創建類的唯一實例
private static Starving instance = new Starving();
//提供一個用於獲取實例的方法
//需要注意的是,我們這個方法屬於對象,不是類方法
//public Starving getInstance(){
//return instance;
//}
//3.提供一個用於獲取實例的私有的類的靜態成員方法
public static Starving getInstance(){
return instance;
}
}
/**
* 懶漢模式
* @author Administrator
*
*/
public class Lazy {
//將構造方法私有化,不循序外部直接創建對象
private Lazy(){
}
//2.聲明類的唯一實例
private static Lazy instance;
//3.提供一個用於獲取實例的方法
public static Lazy getInstance(){
if(instance == null){
instance = new Lazy();
}
return instance;
}
}
三、總結與區別:
餓漢模式的特點是加載類時比較慢,但運行時獲取對象的速度比較快,線程安全。餓漢式是線程安全的,在類創建的同時就已經創建好一個靜態的對象供系統使用,以后不在改變。懶漢模式的特點是加載類時比較快,但是在運行時獲取對象的速度比較慢,線程不安全, 懶漢式如果在創建實例對象時不加上synchronized則會導致對象的訪問不是線程安全的。所以在此推薦大家使用餓漢模式。
---------------------
本文來自 wpda_csdn 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/wpda_csdn/article/details/45460167?utm_source=copy
