java 單例模式(餓漢模式與懶漢模式)
java 單例模式
餓漢式單例
對(duì)于餓漢模式,我們可這樣理解:該單例類非常餓,迫切需要吃東西,所以它在類加載的時(shí)候就立即創(chuàng)建對(duì)象。
懶漢式單例類
對(duì)于懶漢模式,我們可以這樣理解:該單例類非常懶,只有在自身需要的時(shí)候才會(huì)行動(dòng),從來不知道及早做好準(zhǔn)備。它在需要對(duì)象的時(shí)候,才判斷是否已有對(duì)象,如果沒有就立即創(chuàng)建一個(gè)對(duì)象,然后返回,如果已有對(duì)象就不再創(chuàng)建,立即返回。
單例設(shè)計(jì)模式常用于JDBC鏈接數(shù)據(jù)庫(kù)
注意:
1 我們常用的是第一種餓漢式,因?yàn)?
(1)既然采用了單例設(shè)計(jì)模式,就是為了使用單例類的對(duì)象,所以就先把他實(shí)例化出來.
(2)在懶漢式中存在一定的安全隱患,需要加上同步關(guān)鍵字synchronized,否則就談不上單例了,但是加上了synchronized效率就稍遜了
2 在第一種辦法中,代碼private static final Single SINGLE=new Single();為什么有final呢?
因?yàn)楸籪inal關(guān)鍵字修飾的類,不能被繼承,被final修飾的成員變量不可以被修改.
此處用了final為了強(qiáng)化和重點(diǎn)突出:"同一對(duì)象"這個(gè)概念——只有這么一個(gè)對(duì)象,而且它是不可以被修改的.
如果不用final修飾 Single SINGLE那么就會(huì)有這么一種情況:業(yè)務(wù)很復(fù)雜,在不經(jīng)意間就修改了此對(duì)象,造成各種錯(cuò)誤.
第一種(餓漢式):
思路:
(1)不讓其他類建立該類的對(duì)象.即將構(gòu)造函數(shù)設(shè)置為私有!
(2)自定義一個(gè)本類對(duì)象
(3)將自定義的對(duì)象提供出去.即定義一個(gè)get方法,返回值為此類的對(duì)象。
分析:
第一步:將單例類中構(gòu)造函數(shù)私有化了且利用一個(gè)get()函數(shù)向外提供此類的對(duì)象,所以其他類無(wú)法構(gòu)造此類的對(duì)象。
第二步:但其他類要想調(diào)用此單例類里的方法,于是只有采用內(nèi)名.方法名()來實(shí)現(xiàn),這就要求這個(gè)方法必須是靜態(tài)static的。
第三步:又因?yàn)殪o態(tài)方法只能訪問靜態(tài)成員!所以要將SINGLE設(shè)置為靜態(tài)的
public class SingleDemo {
public static void main(String[] args) {
Single s1=Single.getSingle();
s1.setNumber(44);
Single s2=Single.getSingle();
s2.setNumber(55);
System.out.println("s1.number="+s1.number);
System.out.println("s2.number="+s2.number);
if(s1.equals(s2)){
System.out.println("s1與s2是同一對(duì)象即:s1==s2");//if條件成立
}
}
}
class Single{
int number;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
private Single(){};//第一步
private static final Single SINGLE=new Single();//第三步
public static Single getSingle(){//第一步和第二步
return SINGLE;
}
}
第二種(懶漢式):
package cn.com;
public class SingleDemo2 {
public static void main(String[] args) {
Single s1=Single.getSingle();
s1.setNumber(44);
Single s2=Single.getSingle();
s2.setNumber(55);
System.out.println("s1.number="+s1.number);
System.out.println("s2.number="+s2.number);
if(s1.equals(s2)){
System.out.println("s1與s2是同一對(duì)象即:s1==s2");//if條件成立
}
}
}
class Single{
int number;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
private Single(){};
private static Single SINGLE=null;
public static synchronized Single getSingle(){//多線程時(shí)加上synchronized是關(guān)鍵?。?!
if(SINGLE==null){
SINGLE=new Single();
return SINGLE;
}
else{
return SINGLE;
}
}
}
以上就是對(duì)java 單例設(shè)計(jì)模式的詳解,如有疑問請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
ASP.NET在MVC中MaxLength特性設(shè)置無(wú)效的解決方法
這篇文章主要介紹了ASP.NET在MVC中MaxLength特性設(shè)置無(wú)效的解決方法,涉及對(duì)MVC中表單元素屬性的應(yīng)用技巧,需要的朋友可以參考下2014-11-11
ASP.NET簡(jiǎn)化編輯界面解決思路及實(shí)現(xiàn)代碼
簡(jiǎn)化用戶操作界面,添加功能一般沒法簡(jiǎn)化,但是如果是在GridView做顯示,編輯,更新與刪除,會(huì)讓用戶在編輯,需要點(diǎn)擊編輯銨鈕,再進(jìn)行編輯,或是取消編輯,下面是改進(jìn)的方法做了演示動(dòng)畫,感興趣的朋友可以了解下2013-01-01
asp.net core新特性之TagHelper標(biāo)簽助手
這篇文章主要為大家詳細(xì)介紹了asp.net core新特性之TagHelper標(biāo)簽助手的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
一步步打造簡(jiǎn)單的MVC電商網(wǎng)站BooksStore(4)
這篇文章主要和大家一起一步步打造一個(gè)簡(jiǎn)單的MVC電商網(wǎng)站,MVC電商網(wǎng)站BooksStore第四篇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04

