程式設計開發常用設計模式學習與總結。
一。 單例模式
有以下的特點:(eg。每台計算機可以有若干通訊埠,系統應當集中管理這些通訊埠,以避免乙個通訊埠同時被兩個請求同時呼叫。為了避免不一致狀態)
1、單例類只能有乙個例項。
2、單例類必須自己建立自己的唯一例項。
3、單例類必須給所有其他物件提供這一例項。
1)懶漢式單例:singleton通過將構造方法限定為private避免了類在外部被例項化,在同乙個虛擬機器範圍內,singleton的唯一例項只能通過getinstance()方法訪問。
//懶漢式單例類.在第一次呼叫的時候例項化自己
public class singleton
private static singleton single=null;
//靜態工廠方法
public static singleton getinstance()
return single;
} }
ps:以上懶漢式單例的實現沒有考慮執行緒安全問題,它是執行緒不安全的,併發環境下很可能出現多個singleton例項,要實現執行緒安全,有以下三種方式,都是對getinstance這個方法改造,保證了懶漢式單例的執行緒安全,
2)餓漢式單例:(餓漢式在類建立的同時就已經建立好乙個靜態的物件供系統使用,以後不再改變,所以天生是執行緒安全的。)
//餓漢式單例類.在類初始化時,已經自行例項化
public class singleton1
private static final singleton1 single = new singleton1();
//靜態工廠方法
public static singleton1 getinstance()
}3) 餓漢式和懶漢式區別
從名字上來說,餓漢和懶漢,
餓漢就是類一旦載入,就把單例初始化完成,保證getinstance的時候,單例是已經存在的了,
而懶漢比較懶,只有當呼叫getinstance的時候,才回去初始化這個單例。
另外從以下兩點再區分以下這兩種方式:
1、執行緒安全:
餓漢式天生就是執行緒安全的,可以直接用於多執行緒而不會出現問題,
懶漢式本身是非執行緒安全的,為了實現執行緒安全有幾種寫法,分別是上面的1、2、3,這三種實現在資源載入和效能方面有些區別。
2、資源載入和效能:
餓漢式在類建立的同時就例項化乙個靜態物件出來,不管之後會不會使用這個單例,都會佔據一定的記憶體,但是相應的,在第一次呼叫時速度也會更快,因為其資源已經初始化完成,
而懶漢式顧名思義,會延遲載入,在第一次使用該單例的時候才會例項化物件出來,第一次呼叫時要做初始化,如果要做的工作比較多,效能上會有些延遲,之後就和餓漢式一樣了。
1.在getinstance方法上加同步
public static synchronized singleton getinstance()
return single;
}2. 雙重檢查鎖定:
public static synchronized singleton getinstance()
return single;
}3. 靜態內部類:
public class singleton
private singleton (){}
public static final singleton getinstance()
}至於1、2、3這三種實現又有些區別,
第1種,在方法呼叫上加了同步,雖然執行緒安全了,但是每次都要同步,會影響效能,畢竟99%的情況下是不需要同步的,
第2種,在getinstance中做了兩次null檢查,確保了只有第一次呼叫單例的時候才會做同步,這樣也是執行緒安全的,同時避免了每次都同步的效能損耗
第3種,利用了classloader的機制來保證初始化instance時只有乙個執行緒,所以也是執行緒安全的,同時沒有效能損耗,所以一般我傾向於使用這一種。
執行緒安全:乙個類或者程式所提供的介面對於執行緒來說是原子操作,或者多個執行緒之間的切換不會導致該介面的執行結果存在二義性,也就是說我們不用考慮同步的問題,那就是執行緒安全的。
以下是乙個單例類使用的例子,以懶漢式為例,這裡為了保證執行緒安全,使用了雙重檢查鎖定的方式:
public class testsingleton
private static volatile testsingleton instance = null;
public static testsingleton getinstance()
}
}
return instance;
} public string getname()
public void setname(string name)
public void printinfo()
}public class tmain else
} }
結論:由結果可以得知單例模式為乙個物件導向的應用程式提供了物件惟一的訪問點,不管它實現何種功能,整個應用程式都會同享乙個例項物件。
對於單例模式的幾種實現方式,知道餓漢式和懶漢式的區別,執行緒安全,資源載入的時機,還有懶漢式為了實現執行緒安全的3種方式的細微差別。
設計模式學習筆記七 常用設計模式原則總結
前面學習了一部分建立型模式,發現了乙個比設計模式更重要的東西 設計模式原則。對於設計模式來說,為什麼這個模式要這樣解決這個問題,而另乙個模式要那樣,它們背後都遵循的就是永恆的設計原則。可以說,設計原則是設計模式的靈魂。三大基本物件導向設計原則 1.針對介面程式設計,而不是針對實現程式設計 2。優先使...
常用設計模式總結
某些類的頻繁建立和銷毀,毫無意義浪費系統開銷。單例模式保證在jvm中只存在乙個例項。優勢 1.減少new關鍵字的使用,降低系統開銷 2.避免對共享資源的多重占用 通過getlnstance 獲得物件的引用 1 餓漢式 沒有加鎖同步,執行效率高,但類載入時即初始化,不經過懶載入,浪費記憶體 publi...
PHP 設計模式 筆記與總結(7)介面卡模式
介面卡模式可以將截然不同的函式介面封裝成統一的 api 實際應用舉例 php 的資料庫操作有 mysql,mysqli,pdo 三種,可以用介面卡模式統一成一致。類似的場景還有 cache 介面卡,將 memcache,redis,file,apc 等不同的快取函式,統一成一致 實現 在 commo...