設計模式
單例模式
懶漢式
有線程安全和不安全的寫法
public class SingletonL {
private static SingletonL instance=null;
private SingletonL(){}
public static SingletonL getInstance(){
if(instance == null){
instance=new SingletonL();
}
return instance;
}
}
複製代碼
餓漢式
沒有線程安全問題,但是浪費內存空間
class SingletonE{
private static SingletonE instance=new SingletonE();
private SingletonE(){ }
public static SingletonE getInstance(){
return instance;
}
}
複製代碼
雙檢鎖
整個懶漢和餓漢,synchronized內外都加了if判斷,保證線程安全
class DoubleCheck{
private static DoubleCheck instance=null;
private DoubleCheck(){}
public static DoubleCheck getInstance(){
if(instance==null){
synchronized (DoubleCheck.class){
if (instance==null){
instance=new DoubleCheck();
}
}
}
return instance;
}
}
複製代碼
靜態內部類
只適用於靜態域的情況
class Singleton{
private static class SingletonHolader{
private static final Singleton INSTANCE=new Singleton();
}
private Singleton(){}
public static final Singleton getInstance(){
return SingletonHolader.INSTANCE;
}
}
複製代碼
枚舉類
enum SingletonEnum{
INSTANCE;
}
複製代碼
工廠模式
根據傳入一個唯一的標識來獲得Bean對象。
適配器模式
工廠方法模式
由應用程序直接使用new創建新的對象,爲了將對象的創建和使用相分離,採用工廠模式,即應用程序將對象的創建及初始化職責交給工廠對象。
裝飾模式
動態的給對象增加職責,即增加其額外功能。Wrapper和Decorator
代理模式
爲其他對象提供一種代理以控制這個對象的訪問,SpringAOP,JDK動態代理和CGLib代理
觀察者模式
定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,所有依賴於它的對象都得到通知並自動更新。ApplicationListener
策略模式
定義一系列算法,並將每個算法封裝起來,使它們可以相互替換,且算法的改變不會影響使用算法的客戶。
Spring中在實例化對象的時候用到Strategy模式
模版方法模式
定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。使得子類可以不改變該算法結構的情況下重定義該算法的某些特定步驟。
Spring中的JdbTemplate的execute方法
SpringAop
面向切面編程
通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能。
JDK動態代理
根據類加載器和接口創建代理類,面向接口生成代理
利用反射機制生成一個實現代理接口的匿名類,在調用方法前調用InvokeHandler來處理
CGLib代理
利用asm開源包,對代理對象類的class文件加載進來,通過修改其字節碼生成子類來處理,不需要實現接口
Spring中目標對象實現接口默認採用JDK動態代理,也可以強制使用CGLib;
目標對象沒有實現接口,必須採用CGLib庫,spring會自動在JDK和CGLib之間轉換