餓漢模式和懶漢模式的比較


一、單例模式構建原理分析:

我們平時在開發過程中經常會創建多個實例,那是因為在我們new class中

public class Starving {
 //這個位置存在一個默認的構造方法,只要有這個默認構造方法,就可以創造多個實例
 }

而我們單例模式只允許獲取一個實例,那怎么辦呢?

 1.修改默認的構造方法
 2.我們把默認的構造方法設置為私有的
 3.一旦創建為私有的,那么外界就無法通過構造方法創建實例,就避免創建多個實例

 新的問題就來了,單例模式要保證至少而且只有一個實例,而外部無法創建?
 1.自己創建一個實例,自己可以調用我們自己私有的構造方法來創建一個類的實例
   例如:Starving instance = new Starving();
 2.創建實例以后,我們怎么把這個實例提供給外部呢?
   一般我們要獲取成員通過對象.的形式獲取,而現在外部根本無法去獲取這個對象
   static Starving instance = new Starving();
   通過static變為類的成員,我們就可以通過類名的方式去訪問這個成員。
   Starving star1 = Starving.instance; //這種方式獲取實例
   Starving star2 = Starving.instance; //這種方式獲取實例

   提供一個用於獲取實例的方法
    //需要注意的是,我們這個方法屬於對象,不是類方法
    public Starving getInstance(){
       return instance;
    }
    那么我們可以把他變為私有的靜態成員類方法
    public static Starving getInstance(){
       return instance;
     }
    所以,外部就可以以這種方式訪問到
    Starving star = Starving.getInstance();

二、創建單例模式

創建單例有兩種模式,一種是餓漢模式,一種是懶漢模式,具體代碼如下:

/**
 * 單例模式  餓漢模式
 * @author <wpda
 * 應用場合:只需要一個就足夠了
 * 作用:保證整個程序中某個實例有且只有一個
 */
  public class Starving {
  //1.將構造方法私有化,不允許外部直接創建對象
  private Starving(){
  }
  //2.創建類的唯一實例
  private static Starving instance = new Starving();
  //提供一個用於獲取實例的方法
  //需要注意的是,我們這個方法屬於對象,不是類方法
  //public Starving getInstance(){
  //return instance;
  //}
  //3.提供一個用於獲取實例的私有的類的靜態成員方法
  public static Starving getInstance(){
       return instance;
       
  }
}

 

/**
 * 懶漢模式
 * @author Administrator
 *
 */
public class Lazy {
  //將構造方法私有化,不循序外部直接創建對象
  private Lazy(){
  }
  //2.聲明類的唯一實例
  private static Lazy instance;
  //3.提供一個用於獲取實例的方法
  public static Lazy getInstance(){
    if(instance == null){
       instance = new Lazy();
  }
       return instance;  
  }
}
三、總結與區別:

        餓漢模式的特點是加載類時比較慢,但運行時獲取對象的速度比較快,線程安全。餓漢式是線程安全的,在類創建的同時就已經創建好一個靜態的對象供系統使用,以后不在改變。懶漢模式的特點是加載類時比較快,但是在運行時獲取對象的速度比較慢,線程不安全, 懶漢式如果在創建實例對象時不加上synchronized則會導致對象的訪問不是線程安全的。所以在此推薦大家使用餓漢模式。

---------------------

本文來自 wpda_csdn 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/wpda_csdn/article/details/45460167?utm_source=copy


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM