日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

理解单例模式、单例类

發布時間:2024/4/13 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解单例模式、单例类 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在大部分時候,我們把類的構造器定義成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內部,提高了執行的效率,不必每次獲取對象時都進行同步,只有第一次才同步,創建了以后就沒必要了。

總結

以上是生活随笔為你收集整理的理解单例模式、单例类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。