架構模式之單例模式

                  

            最近一段時間,感受本身的架構設計方面仍是有待提升的,如今不少的第三方應用以及第三方源碼都採用的設計模式,若是不把這些東西搞明白的話,之後學習的時候也會吃力的,最近剛剛總結了單例模式,後繼我也會給你們分享一下其餘的設計模式:web

       1、設計模式分類:
設計模式

建立型模式(建立和管理對象)->5種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式安全

結構型模式->7種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式多線程

行爲型模式->11種:策略模式、模板方法模式、觀察者模式、迭代器模式、責任鏈模式、命令模式、備忘錄模式、架構

狀態模式、訪問者模式、中介者模式、解釋器模式併發

 

 

       二 、爲何使用單例模式框架

節約內存開銷,提升效率(性能),提升資源使用率。性能

 

3、單例模式的特色學習

                斷定一個類結構(它使用什麼設計模式?)優化

特色一:構造方法私有化

特色二:定義靜態方法返回當前對象

特色三:確保這個對象是惟一的

特色四:確保在序列化和反序列化操做的過程當中一樣保證同一個對象。

特色五:不容許有子類(太監類->final

 

 

4、單例模式角色的劃分

                 兩個角色

角色一:客戶端(調用)

角色二:單例類

 

      5、建立型模式-單例模式-模式變種

1、單例模式->惡漢式

優勢:安全(爲你提早準備好,無論你用不用)

缺陷:耗費內存

2、單例模式->懶漢式

優勢:性能高->在必定程度上節約了內存(用到了我纔給你,建立)

缺點:多線程問題很難解決(併發)

Sptring框架、Hebernate框架等等

問題一:不加鎖?

多線程併發狀況下,建立多個對象

解決方案:加鎖解決多建立多個對象問題

問題二:阻塞?

100個線程訪問這個對象,等待上一個線程用完了才容許使用(耗費性能)

3、單例模式-雙重檢查

優點:既可以保證建立對象單例對象,同時也保證了多線程安全

 

第一步:分析編譯器編譯過程

如下代碼作了什麼事情?

Singleton instance = new Singleton()

1-首先:分配內存(new關鍵字)

2-其次:調用構造方法初始化參數

3-最後:將instance對象指向這快內存區域(內存空間)

問題:雙重檢查失敗(失效)?

Java虛擬機(JVM 1.5以前)中Cache、寄存器到主內存回寫數據順序頗有可能亂序,有多是1-2-3,也有多是1-3-2

1-2-3,是先初始化,在指向內存

1-3-2,是先執行空內存,在初始化

解決方案

Java虛擬機(JVM1.5版本以及以後版本,作了優化關鍵字volatilevolatile含義:去掉虛擬機優化代碼)

  

第二步:存在缺陷

爲了提升代碼穩定性,程序正確性,消耗性能。(權衡)

 

第三步:這樣的場景下咱們可使用

使用沒有進行優化過編譯器或者共享內存處理器,正常運行

 

4、單例模式-靜態內部類?->官方推薦使用

優點:既可以保證內存優化,同時也可以保證安全(單例)

 

5、單例模式-枚舉?

高級用法(不少做用)

 

6、單例模式->集合方法-對象管理->不是標準的了

 

總結:第五種方式和第六種只是爲了保證對象爲一個

相關文章
相關標籤/搜索