你所知道的設計模式有哪些?
阿新 • • 發佈:2019-01-09
Java 中一般認為有 23 種設計模式,我們不需要所有的都會,但是其中常用的幾種設計模式應該去掌握。下面列出了所有的設計模式。需要掌握的設計模式我單獨列出來了,當然能掌握的越多越好。
總體來說設計模式分為三大類:
建立型模式,共五種:工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式。
結構型模式,共七種:介面卡模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
行為型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。
1..單例設計模式
最好理解的一種設計模式,分為懶漢式和餓漢式。
1.1 餓漢式
public class SingletonEH {
/**
*是否 Lazy 初始化:否
*是否多執行緒安全:是
*實現難度:易
*描述:這種方式比較常用,但容易產生垃圾物件。
*優點:沒有加鎖,執行效率會提高。
*缺點:類載入時就初始化,浪費記憶體。
*它基於 classloder 機制避免了多執行緒的同步問題,
* 不過,instance 在類裝載時就例項化,雖然導致類裝載的原因有很多種,
* 在單例模式中大多數都是呼叫 getInstance 方法,
* 但是也不能確定有其他的方式(或者其他的靜態方法)導致類裝載,
* 這時候初始化 instance 顯然沒有達到 lazy loading 的效果。
*/
private static SingletonEH instance = new SingletonEH();
private SingletonEH (){
}
public static SingletonEH getInstance() {
System.out.println("instance:"+instance);
System.out.println("載入餓漢式....");
return instance;
}
}
1.2懶漢式
public class SingletonLHsyn {
/**
*是否 Lazy 初始化:是
*是否多執行緒安全:是
*實現難度:易
*描述:這種方式具備很好的 lazy loading,能夠在多執行緒中很好的工作,但是,效率很低,99% 情況下不需要同步。
*優點:第一次呼叫才初始化,避免記憶體浪費。
*缺點:必須加鎖 synchronized 才能保證單例,但加鎖會影響效率。
*getInstance() 的效能對應用程式不是很關鍵(該方法使用不太頻繁)。
*/
private static SingletonLHsyn instance;
private SingletonLHsyn (){}
public static synchronized SingletonLHsyn getInstance() {
if (instance == null) {
instance = new SingletonLHsyn();
}
return instance;
}
}