2.1 善用設計模式 23 (1)
1. 設計模式好處;
![clip_image001[6] clip_image001[6]](http://s1.VeVb.com/20150728/o3lebq0j1bj12.gif)
2.1.1 單例模式 23 (6)
1. 單例模式是一種對象創(chuàng)建模式,用于產生一個對象的具體實例,它可以確保系統(tǒng)中一個類只產生一個實例;
2. 兩大好處:a、對于頻繁創(chuàng)建的對象,可以省略創(chuàng)建對象所花費的時間;b、new操作減少,因而對系統(tǒng)內存的使用頻率也會降低,降低GC壓力,縮短GC停頓時間;
3. 單例模式的參與者:單例類和使用者;
4. 第一種實現(xiàn)方式:私有默認構造器,靜態(tài)getInstance方法;這種實現(xiàn)方式簡單、可靠,但不能延遲加載;
5. 第二種實現(xiàn)方式:私有默認構造器,創(chuàng)建時判斷對象是否為空,提供同步的getInstance方法;這種實現(xiàn)方式雖然能夠延遲加載,但引入了同步,多線程時時耗遠遠大于第一種實現(xiàn);
6. 第三種實現(xiàn)方式:私有默認構造器,私有靜態(tài)內部類里邊創(chuàng)建私有靜態(tài)的實例,靜態(tài)getInstance方法;當getInstance被調用時,才會加載SingletonHolder,從而初始化instance,同時,由于實例的建立是在類加載時完成的,故天生對多線程友好;

![clip_image005[6] clip_image005[6]](http://s1.VeVb.com/20150728/01igp2hyecn12.jpg)
第一種實現(xiàn):
![clip_image007[6] clip_image007[6]](http://s1.VeVb.com/20150728/zvnzcig150k12.jpg)
這種單例的實現(xiàn)方式簡單、有效,但是不能延遲加載;
![clip_image009[6] clip_image009[6]](http://s1.VeVb.com/20150728/3v3aumxd1ye13.jpg)
![clip_image011[6] clip_image011[6]](http://s1.VeVb.com/20150728/wtfez1tsacw13.jpg)

第二種實現(xiàn)方式,引入延遲加載:



第三種實現(xiàn)方式:








2.1.2 代理模式 28 (17)
1. 使用代理對象完成用戶請求,屏蔽用戶對真實對象的訪問;
2. 使用代理模式的意圖:安全原因、遠程調用、延遲加載(提升系統(tǒng)的性能和反應速度);
3. 代理模式的主要參與者:主題接口、真實主題、代理類、客戶端;
4. 延遲加載的常用案例:數據庫連接、系統(tǒng)啟動,hibernate框架;
5. 延遲加載的核心思想:如果當前并沒有使用該組件,則不需要真正地初始化它,使用一個代理對象替代它原有的位置,只要在真正需要使用的時候,才對它進行加載;
6. 動態(tài)代理是指在運行時,動態(tài)生成代理類;
7. 和靜態(tài)代理相比,動態(tài)代理的好處:1、不需要為真實主題寫一個形式上完全一樣的封裝類,2、使用一些動態(tài)代理的生成方法甚至可以在運行時指定代理類的執(zhí)行邏輯;
8. 生成動態(tài)代理類的方法有4種:JDK自帶的動態(tài)代理、CGLIB、javassist、ASM庫;
9. JDK自帶的動態(tài)代理使用簡單,但功能較弱;
10. CGLIB和javassist是高級的字節(jié)碼生成庫,性能比JDK自帶的好,且功能強大;
11. ASM庫低級的字節(jié)碼生成工具,對開發(fā)人員要求較高,性能沒有量級的提升,可維護性差,只在性能要求苛刻的地方使用;
12. JDK的動態(tài)代理實現(xiàn):實現(xiàn)InvocationHandler接口,通過PRoxy.newProxyInstance方法創(chuàng)建代理;
13. CGLIB的實現(xiàn)(javassist類似):實現(xiàn)MethodInterceptor接口,new Enhancer-->setCallback-->setInterfaces-->create;
14. javassist有兩種方式創(chuàng)建:1、使用代理工廠;2、通過使用動態(tài)代碼創(chuàng)建;
15. javassist代理工廠方式實現(xiàn):實現(xiàn)MethodInterceptor接口,new ProxyFactory-->setInterfaces-->createClass-->newInstance;
16. javassist使用動態(tài)代碼方式創(chuàng)建,相當靈活,甚至可以在運行時生成業(yè)務邏輯;
17. javassist動態(tài)代碼方式實現(xiàn):ClassPool,CtClass;








jdk的動態(tài)代理實現(xiàn):



CGLIB的實現(xiàn):


javassist的代理工廠實現(xiàn):


javassist動態(tài)java代碼方式實現(xiàn):


幾種實現(xiàn)方式性能測試:




2.1.3 亨元模式 37 (8)
1. 亨元模式以提高系統(tǒng)性能為目的,核心思想是如果一個系統(tǒng)中存在多個相同的對象,那么只需共享一份對象的拷貝,而不必每次都創(chuàng)建新的對象。
2. 亨元模式對性能提升的主要幫助有兩點:(1)、可以節(jié)省重復創(chuàng)建對象的開銷,(2)、由于創(chuàng)建對象的數量減少,所以對內存的需求也減少,GC壓力降低;
3. 亨元模式的主要角色有4個:亨元工廠、抽象亨元、具體亨元類和主函數;
4. 一般情況下,亨元工廠會維護一個對象列表,如果請求的對象已經創(chuàng)建,則直接返回,如果沒有,則創(chuàng)建對象加入到維護隊列中;
5. 亨元模式的典型應用:SAAS系統(tǒng)(Software As A Service,目前比較流行的一種軟件應用模式);
6. 以一個人事管理系統(tǒng)的SAAS系統(tǒng)為例,公司甲、乙、丙都為這個SAAS系統(tǒng)的用戶,則3個亨元實例,就足以應付300個員工的查詢請求了;
7. 亨元模式和對象池的最大不同是亨元模式的對象都是不可以相互替代的,對象池的對象都是等價的,如數據庫連接池中的數據庫連接;
8. 報表實例;






實例:







2.1.4 裝飾者模式 40 (7)
1. 裝飾者模式可以動態(tài)添加對象功能;
2. 有一條重要的設計準則叫做合成/聚合復用原則:代碼復用應該盡可能使用委托,而不是使用繼承;因為繼承是一種緊密耦合,任何父類的改動都會影響其子類,不利于系統(tǒng)維護。而委托則是松散耦合,只要接口不變,委托類的改動并不會影響其上層對象;
3. 裝飾者模式通過委托機制,復用系統(tǒng)中的各個組件,在運行時,可以將這些功能組件進行疊加,從而構造一個“超級對象”,使其擁有所有這些組件的功能;
4. 裝飾者模式的好處:可以有效地分離性能組件和功能組件,從而提升模塊的可維護性并增加模塊的復用性;
5. 裝飾者模式的主要角色有4個:組件接口、具體組件、裝飾者、具體裝飾者;
6. 裝飾者的典型案例是對輸出結果進行增強,對輸出內容轉化為HTML,增加HTTP頭;
7. JDK中不少組件用裝飾者模式實現(xiàn),比如OutputStream和InputStream類族的實現(xiàn);



案例:










jdk中的不少組件用裝飾者模實現(xiàn);







2.1.5 觀察者模式 46 (5)
1. 當一個對象的行為依賴于另一個對象的狀態(tài)時,適用于觀察者模式,如果不用,則一般需要在另一個線程中不停監(jiān)聽對象所依賴的狀態(tài),增加系統(tǒng)的負擔;
2. 觀察者模式的意義在于:可以在單線程中,使某一個對象,及時得知自身所依賴的狀態(tài)變化。
3. 觀察者模式可以用于事件監(jiān)聽、通知發(fā)布等場合;
4. 觀察者模式的主要角色有4個:主題接口、具體主題、觀察者接口、具體觀察者;
5. JDK有一套觀察者模式的實現(xiàn),java.util.Observable類和java.util.Observer接口,



實例:







2.1.6 Value Object模式 50 (2)
1. 在J2EE軟件開發(fā)中,通常會對系統(tǒng)模塊進行分層;
2. Value Object模式提倡將一個對象的各個屬性進行封裝,將封裝后的對象在網絡中傳遞,從而擁有更好的交互模型,并且減少網絡通信數據,從而提高系統(tǒng)性能;



2.1.7 業(yè)務代理模式 53 (2)
1. 業(yè)務代理模式是將一組由遠程方法調用構成的業(yè)務流程,封裝在一個位于展示層的代理中;
2. 業(yè)務代理模式將一些業(yè)務流程封裝在前后臺系統(tǒng),為系統(tǒng)性能優(yōu)化提供了基礎平臺,在業(yè)務代理中,不僅可以復用業(yè)務流程,還可以視情況為展示層組件提供緩存等功能,從而減少遠程方法調用次數,降低系統(tǒng)壓力;








2.2 常用優(yōu)化組件和方法 56 (2)
1. 組件:緩沖和緩存;
2. 常用的5個優(yōu)化思想:池化對象、并行代替串行、負載均衡、時間換空間、空間換時間;
2.2.1 緩沖(Buffer) 56 (6)
1. 緩沖區(qū)是一塊特定的內存區(qū)域;
2. 開辟緩沖區(qū)的目的是緩解應用程序上下層之間的性能差異,提高系統(tǒng)的性能。
3. 日常生活中,緩沖區(qū)的一個典型應用是漏斗;
4. 緩沖可以協(xié)調上層組件和下層組件的性能差,當上層組件性能優(yōu)于下層組件時,可以有效較少上層組件對下層組件的等待時間;
5. 緩沖最常用的場景就是提高I/O的速度;
6. 案例:使用緩沖區(qū)提升動畫顯示效果(先在內存中畫圓,然后一次性顯示出來);







案例:使用緩沖區(qū)提升動畫顯示效果



新聞熱點
疑難解答