單例模式:
單利模式是一種對象創建型模式,使用單例模式,可以保證爲一個類只生成唯一的實例對象。也就是說,在整個程序空間中,該類只存在一個實例對象。
其實,GoF對單例模式的定義是:保證一個類只有一個實例存在,同時提供能對該實例加以訪問的全局訪問方法。
爲什麼使用單例模式?
在應用系統開發中,我們常常有以下需求:在多個線程之間,比如servlet環境,共享同一個資源或者操作同一個對象
在整個程序空間使用全局變量,共享資源
大規模系統中,爲了性能的考慮,需要節省對象的創建時間等等。
因爲singleton模式可以保證爲一個類只生成唯一的實例對象,所以這些情況,singleton模式就派上用場了。
單例模式實現:
1.餓漢式
package singleton;
/**
* 車票的單例
* 餓漢式
* @author guosheng
*
*/
public class CardSingleTon {
private static CardSingleTon cst = new CardSingleTon(50);
public CardSingleTon(int cardNum){
this.cardNum = cardNum;
}
private int cardNum;
public int getCardNum() {
return cardNum;
}
public void setCardNum(int cardNum) {
this.cardNum = cardNum;
}
public static CardSingleTon getCardSingleTon(){
return cst;
}
}
2.懶漢式
package singleton;
/**
* 車票的單例
* 懶漢式----------------多線程不安全
* @author guosheng
*
*/
public class CardSingleTon {
//private static CardSingleTon cst = new CardSingleTon(50);
private static CardSingleTon cst;
public CardSingleTon(int cardNum){
this.cardNum = cardNum;
}
private int cardNum;
public int getCardNum() {
return cardNum;
}
public void setCardNum(int cardNum) {
this.cardNum = cardNum;
}
public static CardSingleTon getCardSingleTon(){
if(null == cst){
cst = new CardSingleTon(50);
}
return cst;
}
}
3.雙重檢查
/**
* 車票的單例
* 雙重檢查
* @author guosheng
*
*/
public class CardSingleTon {
//private static CardSingleTon cst = new CardSingleTon(50);
private static CardSingleTon cst;
public CardSingleTon(int cardNum){
this.cardNum = cardNum;
}
private int cardNum;
public int getCardNum() {
return cardNum;
}
public void setCardNum(int cardNum) {
this.cardNum = cardNum;
}
public static CardSingleTon getCardSingleTon(){
if(null == cst){
synchronized(cst){
if(null == cst){
cst = new CardSingleTon(50);
}
}
}
return cst;
}
}