单例模式:
单利模式是一种对象创建型模式,使用单例模式,可以保证为一个类只生成唯一的实例对象。也就是说,在整个程序空间中,该类只存在一个实例对象。
其实,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;
}
}