單例模式(Singleton)
一種創(chuàng)建性模型,它用來確保只產生一個實例,并提供一個訪問它的全局訪問點.對一些類來說,保證只有一個實例是很重要的,比如有的時候,數據庫連接或 Socket 連接要受到一定的限制,必須保持同一時間只能有一個連接的存在.
單例模式的類型:
一、餓漢模式
創(chuàng)建一個類较店,將其構造方法私有化绳军,外界無法創(chuàng)建此類的對象,實例化一個對象埋嵌,外界可以通過這個類的對象進行訪問,當將這個實例化的對象變成私有對象時,此前使用的方法失效席覆,這時可以為外界提供一個獲取實例化對象的方法直砂,使用public static進行修飾菌仁,外界可以通過這個方法訪問這個類中的對象。
public class Singleton1 {
//構造方法私有化
private Singleton1(){
}
//創(chuàng)建類的唯一實例,使用private static修飾
private static Singleton1 instance = new Singleton1();
//提供一個獲取實例的方法静暂,使用public static修飾
public static Singleton1 getInstance(){
return instance;
}
}
public class test {
public static void main(String[] args){
//餓漢模式
Singleton1 s1 = Singleton1.getInstance();
Singleton1 s2 = Singleton1.getInstance();
if(s1==s2){
System.out.println(true);
}else {
System.out.println(false);
}
}
}
二济丘、餓漢模式
創(chuàng)建一個類,將其構造方法私有化洽蛀,外界無法創(chuàng)建此類的對象摹迷,聲明類的唯一實例,使用private static修飾,提供一個獲取實例的方法getinstance郊供,使用public static修飾.
public class Singleton2 {
//構造方法私有化
private Singleton2() {
}
//聲明類的唯一實例,使用private static修飾
private static Singleton2 instance;
//提供一個獲取實例的方法峡碉,使用public static修飾
public static Singleton2 getinstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
}
public class test {
public static void main(String[] args){
//懶漢模式
Singleton2 s3 = Singleton2.getinstance();
Singleton2 s4 = Singleton2.getinstance();
if(s3==s4){
System.out.println(true);
}else {
System.out.println(false);
}
}
}
兩種模式的測試結果都是true,那么這兩種模式有什么相同點和區(qū)別呢驮审?
首先兩種方案的構造函數和公用方法都是靜態(tài)的(static)鲫寄,實例和公用方法又都是私有的(private)吉执。
區(qū)別在于以下幾點:
1、餓漢式是線程安全的,在類創(chuàng)建的同時就已經創(chuàng)建好一個靜態(tài)的對象供系統使用,以后不在改變塔拳。懶漢式如果在創(chuàng)建類的同時未創(chuàng)建對象鼠证,線程是不安全的。
2靠抑、從實現方式來講他們最大的區(qū)別就是懶漢式是延時加載,它是在需要的時候才創(chuàng)建對象,而餓漢式在虛擬機啟動的時候就會創(chuàng)建量九,餓漢式無需關注多線程問題、寫法簡單明了颂碧、能用則用荠列。但是它是加載類時創(chuàng)建實例。