Java 中設計模式 (單例模式) 介紹

YX_blog發表於2015-08-19

 需求 :保證了一個類在記憶體中只能有一個物件


思路:1、如果其他程式能夠隨意用new建立該類物件,那麼就無法控制個數。因此,不讓其他程式用new建立該類的對象。
   2、既然不讓其他程式new該類物件,那麼該類在自己內部就要建立一個物件,否則該類就永遠無法建立物件了。
   3、該類將建立的物件對外(整個系統)提供,讓其他程式獲取並使用。

解決步驟:1、 將該類中的建構函式私有化。
  2、在本類中建立一個本類物件。
      3、定義一個方法,返回值型別是本類型別。讓其他程式通過該方法就可以獲取到該類物件。

單例的設計模式包括:

餓漢式

懶漢式

餓漢式 介紹:

在開始時就 new 物件

簡單程式碼實現

package cn.hncu.designl.sigal;

//餓漢式

public class P1 {
	private static  final  P1 p=new P1();//為了不讓直接訪問,將其私有化
	private  P1(){};//構造方法私有化
	public static  P1 get(){//通過類名可以掉這個方法,從而可以訪問到私有的建構函式
		System.out.println("11111111");
		return p;//返回可以造物件的p
	}
}
    

懶漢式:

和餓漢式不同,再呼叫的時候進行判斷 new物件;

在判斷時候需要將其上鎖,不然會出現問題(本人清測)

執行緒A希望使用SingletonClass,呼叫getInstance()方法。因為是第一次呼叫,A就發現instance是null的,於是它開始建立例項,就在這個時候,CPU發生時間片切換,執行緒B開始執行,它要使用SingletonClass,呼叫getInstance()方法,同樣檢測到instance是null——注意,這是在A檢測完之後切換的,也就是說A並沒有來得及建立物件——因此B開始建立。B建立完成後,切換到A繼續執行,因為它已經檢測完了,所以A不會再檢測一遍,它會直接建立物件。這樣,執行緒A和B各自擁有一個SingletonClass的物件——單例失敗!

package cn.hncu.designl.sigal;

public class P2 {
	private static  P2 p=null;//與餓漢式不一樣,這裡先不要new 物件,但是同樣的私有化
	private P2(){}//私有化
	public static  synchronized  P2   getinstance(){//若是多執行緒會出現錯誤(本人清測),所以需要synchronized將其鎖起來
		if(p==null){//為空就直接new 物件
			p=new P2();
		}
		return p;//返回 造的物件
	}

	
}


設計思想高深,這個只是簡單的用程式碼稍微的演示下,下面是呼叫上面的測試程式

package cn.hncu.designl.sigal;



public class test {

	
	public static void main(String[] args) {
		P1 p1=P1.get();
		P1 p2=P1.get();
		System.out.println(p1==p2);//餓漢式單模式//直接就賦值
		
		
		//懶漢式
		P2 p3=P2.getinstance();//類名直接調
		P2 p4=P2.getinstance();
		System.out.println(p3==p4);
	
		  
		
			
		
	}

}

     

相關文章