一個(gè)類始終只能創(chuàng)建一個(gè)實(shí)例,這個(gè)類被稱為單例類谎柄。在一些特殊情況下,系統(tǒng)會(huì)不允許自由創(chuàng)建某個(gè)類的對象惯雳,只能為該類創(chuàng)建一個(gè)對象朝巫,此時(shí)就可以把該類的構(gòu)造方法使用private修飾,將其所有的構(gòu)造方法隱藏起來石景。
一旦把該類的構(gòu)造方法隱藏起來劈猿,則需要提供一個(gè)public方法拙吉,作為該類的訪問點(diǎn),用于創(chuàng)建該類的對象糙臼,并且該方法必須使用static修飾(因?yàn)檎{(diào)用該方法之前還不存在對象庐镐,因此調(diào)用該方法的不可能是對象恩商,只能是類)变逃。除此之外,該類還必須緩存已經(jīng)創(chuàng)建的對象怠堪,否則隨后他無法知道是否曾經(jīng)創(chuàng)建過對象揽乱,也就無法保證值創(chuàng)建一個(gè)對象。為此該類需要使用一個(gè)屬性來保存曾經(jīng)創(chuàng)建的對象粟矿,且因?yàn)閷傩孕枰簧厦娴撵o態(tài)方法訪問凰棉,所以必須使用static修飾,基于上面的介紹陌粹,我們來創(chuàng)建一個(gè)單例類:
綜上所述撒犀,這個(gè)類從上倒下有三個(gè)注意點(diǎn):
1.聲明一個(gè)靜態(tài)變量緩存創(chuàng)建的對象
2.構(gòu)造函數(shù)private修飾
3.聲明一個(gè)public方法,靜態(tài)掏秩,返回值類型為本類或舞,返回一個(gè)本類對象,就是第一步創(chuàng)建的那個(gè)對象
class Single {
// 使用一個(gè)變量來緩存創(chuàng)建的實(shí)例
private static Single single;
// 將構(gòu)造方法使用private修飾蒙幻,隱藏該構(gòu)造方法
private Single() {
}
// 提供一個(gè)靜態(tài)方法用于返回Single實(shí)例映凳,該方法可以假如自定義的控制,保證只產(chǎn)生一個(gè)Single對象
public static Single getSingle() {
if (single == null) {
single = new Single();
}
return single;
}
}
public class SingleTest {
public static void main(String[] args) {
// 創(chuàng)建Single對象 不能通過構(gòu)造方法邮破,只能通過singleT方法
Single s1 = Single.getSingle();
Single s2 = Single.getSingle();
System.out.println(s1 == s2);
}
}
返回值為:true
通過上面的getSingle方法提供的自定義控制诈豌,保證Single類只能產(chǎn)生一個(gè)實(shí)例,所以在SingleTest類的main方法中看到兩次產(chǎn)生的Single對象實(shí)際上是同一個(gè)對象抒和,兩個(gè)棧中變量s1矫渔,s2指向了堆中的同一個(gè)對象。