有線程安全和不安全的寫法java
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判斷,保證線程安全spring
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和Decoratorapp
爲其餘對象提供一種代理以控制這個對象的訪問,SpringAOP,JDK動態代理和CGLib代理spa
定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴於它的對象都獲得通知並自動更新。ApplicationListener線程
定義一系列算法,並將每一個算法封裝起來,使它們能夠相互替換,且算法的改變不會影響使用算法的客戶。設計
Spring中在實例化對象的時候用到Strategy模式
定義一個操做中的算法的骨架,而將一些步驟延遲到子類中。使得子類能夠不改變該算法結構的狀況下重定義該算法的某些特定步驟。
Spring中的JdbTemplate的execute方法
面向切面編程
經過預編譯方式和運行期動態代理實如今不修改源代碼的狀況下給程序動態統一添加功能。
根據類加載器和接口建立代理類,面向接口生成代理
利用反射機制生成一個實現代理接口的匿名類,在調用方法前調用InvokeHandler來處理
利用asm開源包,對代理對象類的class文件加載進來,經過修改其字節碼生成子類來處理,不須要實現接口
Spring中目標對象實現接口默認採用JDK動態代理,也能夠強制使用CGLib;
目標對象沒有實現接口,必須採用CGLib庫,spring會自動在JDK和CGLib之間轉換