理解单例模式、单例类
生活随笔
收集整理的這篇文章主要介紹了
理解单例模式、单例类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在大部分時候,我們把類的構造器定義成public訪問權限,允許任何類自由創建該類的對象。但是在某些時候,允許其他類自由創建該類的對象沒有任何意義,還可能造成系統性能下降(因為創建一個對象的系統開銷問題)。例如系統可能只有一個窗口管理器,一個假脫機打印設備或一個數據庫引擎訪問點,此時如果在系統中為這些類創建多個對象就沒有太大的事跡意義。
如果一個類始終只能創建一個實例,則這個類被稱為單例類。
總之,在一些特殊場景下,要求不允許自由創建該類的對象,而是只允許為該類創建一個對象。為避免其他類自由創建該類的實例,我們把該類的構造器使用private修飾,從而把該類的所有構造器隱藏起來。
根據良好的封裝的原則:一旦把該類的構造器隱藏起來,則需要提供一個public方法作為該類的訪問點,用于創建該類的對象,且該方法必須使用static修飾(因為調用該方法之前還不存在對象,因此調用該方法的不可能是對象,只能是類)。
除此之外,該類還必須緩存已經創建的對象,否則改類無法知道是否曾將創建過對象,也就無法保證值創建一個對象。為此改類需要使用一個屬性來保存曾經創建的對象,因為該屬性需要被上面的靜態方法訪問,故此屬性必須使用static修飾。
基于上面的介紹,下面是例子:
class Singleton(
//使用一個變量來緩存曾經創建的實例
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
)
public class TestSingleton{
public static void main(String[] args)
{
singleton s1 = Singleton.getIncetance();
singleton s2 = Singleton.getIncetance();
//將輸出true
System.out.println(s1==s2);
}
}
第二種方法:
public class Singleton {
//在自己內部定義自己的一個實例,只供內部調用
private static Singleton instance = new Singleton();
private Singleton(){
//do something
}
//這里提供了一個供外部訪問本class的靜態方法,可以直接訪問
public static Singleton getInstance(){
return instance;
}
}
第三種方法:
public class Singleton {
private static Singleton instance = null;
private Singleton(){
//do something
}
public static Singleton getInstance(){
if(instance==null){
synchornized(Singleton.class){
if(null == instance){
instance = new Singleton();
}
}
}
return instance;
}
}//這個模式將同步內容下方到if內部,提高了執行的效率,不必每次獲取對象時都進行同步,只有第一次才同步,創建了以后就沒必要了。
如果一個類始終只能創建一個實例,則這個類被稱為單例類。
總之,在一些特殊場景下,要求不允許自由創建該類的對象,而是只允許為該類創建一個對象。為避免其他類自由創建該類的實例,我們把該類的構造器使用private修飾,從而把該類的所有構造器隱藏起來。
根據良好的封裝的原則:一旦把該類的構造器隱藏起來,則需要提供一個public方法作為該類的訪問點,用于創建該類的對象,且該方法必須使用static修飾(因為調用該方法之前還不存在對象,因此調用該方法的不可能是對象,只能是類)。
除此之外,該類還必須緩存已經創建的對象,否則改類無法知道是否曾將創建過對象,也就無法保證值創建一個對象。為此改類需要使用一個屬性來保存曾經創建的對象,因為該屬性需要被上面的靜態方法訪問,故此屬性必須使用static修飾。
基于上面的介紹,下面是例子:
class Singleton(
//使用一個變量來緩存曾經創建的實例
private static Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
)
public class TestSingleton{
public static void main(String[] args)
{
singleton s1 = Singleton.getIncetance();
singleton s2 = Singleton.getIncetance();
//將輸出true
System.out.println(s1==s2);
}
}
第二種方法:
public class Singleton {
//在自己內部定義自己的一個實例,只供內部調用
private static Singleton instance = new Singleton();
private Singleton(){
//do something
}
//這里提供了一個供外部訪問本class的靜態方法,可以直接訪問
public static Singleton getInstance(){
return instance;
}
}
第三種方法:
public class Singleton {
private static Singleton instance = null;
private Singleton(){
//do something
}
public static Singleton getInstance(){
if(instance==null){
synchornized(Singleton.class){
if(null == instance){
instance = new Singleton();
}
}
}
return instance;
}
}//這個模式將同步內容下方到if內部,提高了執行的效率,不必每次獲取對象時都進行同步,只有第一次才同步,創建了以后就沒必要了。
總結
以上是生活随笔為你收集整理的理解单例模式、单例类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “==”和“equals”
- 下一篇: 我犯的错误--struts标签s:rad