單例模式/ java實現附代碼 /

來源:互聯網
上載者:User

標籤:最好   進入   java   一個   can   check   java實現   提高   .com   

注: 情境和例子出自github的設計模式。傳送門:https://github.com/iluwatar/java-design-patterns/tree/master/singleton

意圖:

        單例模式即使為了確保一個類只有一個執行個體,並提供一個全域訪問點。

情境:

        世界上只有一座象牙塔可以讓巫師學習魔法,所有巫師都來到這座象牙塔進行修習。那麼象牙塔就這裡可以理解為單例。簡單的來說就是只建立一個類的一個對象,這個象牙塔就可以理解為唯一對象。

實現:

        想更好的理解單例模式,最好先瞭解一下java中的關鍵字Static。傳送門:http://www.cnblogs.com/ahangBlogs/p/7719330.html

talk is cheap,show me the code.........................................................................................................................................................................................................................................(分割線)

 

列舉幾種單例模式的實現方法:

 一:

package Singleton;public final class IvoryTower {     private IvoryTower(){}          private static final IvoryTower Instance=new IvoryTower();          public static IvoryTower GetInstance(){         return Instance;     }}

二:ThreadSafeLazyLoaded

package Singleton;public final class ThreadSafeLazyLoadedIvoryTower {      private static ThreadSafeLazyLoadedIvoryTower Instance;            private ThreadSafeLazyLoadedIvoryTower(){          if(Instance!=null){              throw new IllegalStateException("Already initialized.");          }      }            public static ThreadSafeLazyLoadedIvoryTower GetInstance(){          if(Instance==null){              Instance=new ThreadSafeLazyLoadedIvoryTower();          }          return Instance;      }}

三:安全執行緒雙重鎖檢查

package Singleton;public class ThreadSafeDoubleCheckLocking {       private static ThreadSafeDoubleCheckLocking instance;              private ThreadSafeDoubleCheckLocking(){           if(instance!=null){               throw new IllegalStateException("Already instance!");           }       }              public static ThreadSafeDoubleCheckLocking GetInstance(){           //使用局部變數可提高25%效能。 出自effectice java th2.. 簡單來說就是局部變數儲存在堆棧中....           ThreadSafeDoubleCheckLocking result=instance;                      //檢查單例模式的實力是否初始化,如果已經初始化就直接返回執行個體,沒有初始化就往下走           if(result==null){               //執行個體沒有初始化,不過我們不能確保在這個時間段其他線程是否初始化了這個執行個體, 所以為了確保正確我們得鎖住一個對象來互斥。                            synchronized (ThreadSafeDoubleCheckLocking.class) {                   //再次將是執行個體賦值給局部變數,這時候當前線程無法進入該鎖空間,如果已經初始化我們返還執行個體                   result=instance;                                      if(result==null){                       //進入該if中,即沒有在其他線程中進行初始化。那麼我們可以安全的建立一個執行個體作為我們的單例執行個體。                       instance=result=new ThreadSafeDoubleCheckLocking();                   }            }                         }               return result;       }       }

四:

package Singleton;public enum EnumIvoryTower {     INSTANCE;         @Override     public String toString(){         return getDeclaringClass().getCanonicalName() + "@" + hashCode();     }}
適用性:

使用Singleton模式

  • 必須只有一個類的執行個體,並且必須可以從知名訪問點訪問用戶端
  • 當唯一的執行個體應該通過子類來擴充時,用戶端應該能夠使用擴充執行個體而不修改它們的代
缺點:
  • 違反單一責任原則(SRP)通過控制自己的創作和生命週期。
  • 鼓勵使用全域共用執行個體,以防止該對象使用的對象和資源被釋放。
  • 建立緊密耦合的代碼。Singleton的客戶變得難以測試。

 

 

 

 

 

 

 

單例模式/ java實現附代碼 /

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.