java 單例模式
餓漢式單例
對于餓漢模式,我們可這樣理解:該單例類非常餓,迫切需要吃東西,所以它在類加載的時候就立即創(chuàng)建對象。
懶漢式單例類
對于懶漢模式,我們可以這樣理解:該單例類非常懶,只有在自身需要的時候才會行動,從來不知道及早做好準(zhǔn)備。它在需要對象的時候,才判斷是否已有對象,如果沒有就立即創(chuàng)建一個對象,然后返回,如果已有對象就不再創(chuàng)建,立即返回。
單例設(shè)計模式常用于JDBC鏈接數(shù)據(jù)庫
注意:
1 我們常用的是第一種餓漢式,因為:
(1)既然采用了單例設(shè)計模式,就是為了使用單例類的對象,所以就先把他實例化出來.
(2)在懶漢式中存在一定的安全隱患,需要加上同步關(guān)鍵字synchronized,否則就談不上單例了,但是加上了synchronized效率就稍遜了
2 在第一種辦法中,代碼private static final Single SINGLE=new Single();為什么有final呢?
因為被final關(guān)鍵字修飾的類,不能被繼承,被final修飾的成員變量不可以被修改.
此處用了final為了強化和重點突出:"同一對象"這個概念——只有這么一個對象,而且它是不可以被修改的.
如果不用final修飾 Single SINGLE那么就會有這么一種情況:業(yè)務(wù)很復(fù)雜,在不經(jīng)意間就修改了此對象,造成各種錯誤.
第一種(餓漢式):
思路:
(1)不讓其他類建立該類的對象.即將構(gòu)造函數(shù)設(shè)置為私有!
(2)自定義一個本類對象
(3)將自定義的對象提供出去.即定義一個get方法,返回值為此類的對象。
分析:
第一步:將單例類中構(gòu)造函數(shù)私有化了且利用一個get()函數(shù)向外提供此類的對象,所以其他類無法構(gòu)造此類的對象。
第二步:但其他類要想調(diào)用此單例類里的方法,于是只有采用內(nèi)名.方法名()來實現(xiàn),這就要求這個方法必須是靜態(tài)static的。
第三步:又因為靜態(tài)方法只能訪問靜態(tài)成員!所以要將SINGLE設(shè)置為靜態(tài)的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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是同一對象即: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; } } |
第二種(懶漢式):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
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是同一對象即: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(){ //多線程時加上synchronized是關(guān)鍵!!! if (SINGLE== null ){ SINGLE= new Single(); return SINGLE; } else { return SINGLE; } } } |
以上就是對java 單例設(shè)計模式的詳解,如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://blog.csdn.net/lfdfhl/article/details/8195006