最近一段時間,感受本身的架構設計方面仍是有待提升的,如今不少的第三方應用以及第三方源碼都採用的設計模式,若是不把這些東西搞明白的話,之後學習的時候也會吃力的,最近剛剛總結了單例模式,後繼我也會給你們分享一下其餘的設計模式: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虛擬機(JVM)1.5版本以及以後版本,作了優化關鍵字volatile (volatile含義:去掉虛擬機優化代碼)
第二步:存在缺陷
爲了提升代碼穩定性,程序正確性,消耗性能。(權衡)
第三步:這樣的場景下咱們可使用
使用沒有進行優化過編譯器或者共享內存處理器,正常運行
4、單例模式-靜態內部類?->官方推薦使用
優點:既可以保證內存優化,同時也可以保證安全(單例)
5、單例模式-枚舉?
高級用法(不少做用)
6、單例模式->集合方法-對象管理->不是標準的了
總結:第五種方式和第六種只是爲了保證對象爲一個