最強設計模式全攻略,看這一篇文章就夠了
導語
什麼是設計模式?
設計模式(Design pattern)代表了最佳的實驗總結,通常被有經驗豐富的軟體軟體工程師所採用。設計模式是軟體工程師在軟體開發過程中面臨的一般問題的解決方案。這些解決方案是相當多的軟體開發人員經過很長的一段時間的試驗和錯誤總結出來的。
設計模式的目的是什麼?為什麼要學習設計模式?
幫助我們將應用組織成容易了解,容易維護,具有彈性的架構,建立可維護的OO系統,要訣在於隨時想到系統以後可能需要的變化以及應付變化的原則。
1、設計模式能讓專業人之間交流方便,如下:
程序員A:這裡我用了XXX設計模式
程序員B:那我大致了解你程序的設計思路了
2、易維護
項目經理:今天客戶有這樣一個需求…
程序員:明白了,這裡我使用了XXX設計模式,所以改起來很快
3、設計模式是編程經驗的總結
程序員A:B,你怎麼想到要這樣去構建你的代碼
程序員B:在我學習了XXX設計模式之後,好像自然而然就感覺這樣寫能避免一些問題
4、學習設計模式並不是必須的,可以使用其他方法代替
程序員A:B,你這段代碼使用的是XXX設計模式對嗎?
程序員B:不好意思,我沒有學習過設計模式,但是我的經驗告訴我是這樣寫的
5、設計模式重語義而不重語法
一種設計模式可以使用多種語法實現
設計模式的分類
1.創建型模式
這些設計模式提供了一種在創建對象的同時隱藏創建邏輯的方式,而不是使用 new 運算符直接實例化對象。這使得程序在判斷針對某個給定實例需要創建哪些對象時更加靈活。工廠模式(Factory Pattern)
抽象工廠模式(Abstract Factory Pattern)
單例模式(Singleton Pattern)
建造者模式(Builder Pattern)
原型模式(Prototype Pattern)
2.結構型模式
這些設計模式關注類和對象的組合。繼承的概念被用來組合介面和定義組合對象獲得新功能的方式。適配器模式(Adapter Pattern)
橋接模式(Bridge Pattern)
過濾器模式(Filter、Criteria Pattern)
組合模式(Composite Pattern)
裝飾器模式(Decorator Pattern)
外觀模式(Facade Pattern)
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
3.行為型模式
這些設計模式特別關注對象之間的通信。責任鏈模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解釋器模式(Interpreter Pattern)
迭代器模式(Iterator Pattern)
中介者模式(Mediator Pattern)
備忘錄模式(Memento Pattern)
觀察者模式(Observer Pattern)
狀態模式(State Pattern)
空對象模式(Null Object Pattern)
策略模式(Strategy Pattern)
模板模式(Template Pattern)
訪問者模式(Visitor Pattern)
4J2EE 模式
這些設計模式特別關注表示層。這些模式是由 Sun Java Center 鑒定的。MVC 模式(MVC Pattern)
業務代表模式(Business Delegate Pattern)
組合實體模式(Composite Entity Pattern)
數據訪問對象模式(Data Access Object Pattern)
前端控制器模式(Front Controller Pattern)
攔截過濾器模式(Intercepting Filter Pattern)
服務定位器模式(Service Locator Pattern)
傳輸對象模式(Transfer Object Pattern
具體設計模式
抽象工廠模式 (Abstract Factory)提供一個創建一系列相關或相互依賴對象的介面,而無需指定它們具體的類。
目的及好處
首先,工廠模式是為了解耦:把對象的創建和使用的過程分開。就是Class 0 想調用 Class 1 ,那麼0隻是調用1的方法,而至於1的實例化,就交給工廠類。
其次,工廠模式可以降低代碼重複。如果創建對象B的過程都很複雜,需要一定的代碼量,而且很多地方都要用到,那麼就會有很多的重複代碼。我們可以這些創建對象B的代碼放到工廠里統一管理。既減少了重複代碼,也方便以後對B的創建過程的修改維護。
由於創建過程都由工廠統一管理,所以發生業務邏輯變化,不需要找到所有需要創建B的地方去逐個修正,只需要在工廠里修改即可,降低維護成本。同理,想把所有調用1的地方改成B的子類11,只需要在對應生產B的工廠中或者工廠的方法中修改其生產的對象為B1即可,而不需要找到所有的new 1()改為new 11()。
另外,因為工廠管理了對象的創建邏輯,使用者並不需要知道具體的創建過程,只管使用即可,減少了使用者因為創建邏輯導致的錯誤。
通俗來講
設計模式的一個重要原則就是:別改代碼,只需要添代碼,以前所有的老代碼,都是有價值的,需要儘力保留
new一個對象時,new的過程是寶貴的如何創建老對象的知識點(有的new很複雜,包括了很多參數),如果這個代碼被修改了,那麼保留的老對象也不知道怎麼使用了,整個體系殘缺了
所以要想辦法保留老對象的new過程,把這個new過程保存分布到一系列工廠類里,就是所謂的工廠模式,一般有三種方式來封裝
簡單工廠:把對象的創建放到一個工廠類中,通過參數來創建不同的對象。
這個缺點是每添一個對象,就需要對簡單工廠進行修改(儘管不是刪代碼,僅僅是添一個switch case,但仍然違背了「不改代碼」的原則)
工廠方法:每種產品由一種工廠來創建,一個工廠保存一個new
基本完美,完全遵循 「不改代碼」的原則
抽象工廠:僅僅是工廠方法的複雜化,保存了多個new 實例
大工程才用的上
工廠模式是創建型模式中最典型的模式,主要是用來創建對象,減少我們在使用某個對象時的new() 操作,我相信大家都有這樣的困惑,目前我所在的項目都在程序開發的過程中,還是
有很多的new()操作出現在表現層中,並沒有通過工廠來創建對象,一方面可能是因為我們自身比較懶,不規範項目的編碼形式,另外一方面也是由於項目的進度比較緊,沒有那麼多的時間去
完成工廠的統一創建,當然對於這樣的動態創建對象的工廠,推薦的做法還是我們後面會講到的創建型模式--《抽象工廠模式》來解決吧。
如果您並不知道工廠模式是用來幹什麼的,我們可以通過如下舉例來說明,例如我們現在有個礦泉水加工廠,加工礦泉水,我們現在知道有礦泉水這個對象,那麼當我批量生產礦泉水的
時候,我們就通過工廠來批量的生產,等於我們程序中的批量創建對象。這時候我有很多個對象,也就是很多遊客,他們每人都要一瓶礦泉水,這時候如果說把遊客比作不同的應用程序模塊,
這種情況下,不同的遊客需要礦泉水的時候,我就new()一個礦泉水和我找個加工廠生產礦泉水明顯是有差別的,這個時候,遊客不應該和礦泉水有
關聯關係了,而且遊客不知道,礦泉水是怎麼生產出來的,也不需要關心這些東西。
基於面向對象的變成設計時,原則就是低耦合,對象和對象之間。那麼對象之間的引用關係,可以通過抽象出介面,通過借口的依賴來解耦,降低系統的耦合性。
BaseProduct: 聲明一個介面,這個介面中包含產品對象類型。
abstract class BaseProductA {
public abstract void show();
}
abstract class BaseProductB {
public abstract void show();
}
ConcreteProduct: 定義一個產品對象,這個產品對象是由相關的具體工廠創建的。
class ConcreteProductA1 extends BaseProductA {
@Override
public void show() {
System.out.println("ConcreteProductA1");
}
}
class ConcreteProductA2 extends BaseProductA {
@Override
public void show() {
System.out.println("ConcreteProductA2");
}
}
class ConcreteProductB1 extends BaseProductB {
@Override
public void show() {
System.out.println("ConcreteProductB1");
}
}
class ConcreteProductB2 extends BaseProductB {
@Override
public void show() {
System.out.println("ConcreteProductB2");
}
}
主函數測試代碼
public class BaseFactoryPattern {
public static void main(String[] args) {
BaseFactory factory0 = new ConcreteFactory1();
BaseProductA productA0 = factory0.createProductA();
BaseProductB productB0 = factory0.createProductB();
productA0.show();
productB0.show();
BaseFactory factory2 = new ConcreteFactory2();
BaseProductA productA2 = factory2.createProductA();
BaseProductB productB2 = factory2.createProductB();
productA2.show();
productB2.show();
}
}
實現工廠方法
class ConcreteFactory1 extendsBaseFactory {
@Override
public BaseProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public BaseProductB createProductB() {
return new ConcreteProductB1();
}
}
class ConcreteFactory2 extends BaseFactory {
@Override
public BaseProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public BaseProductB createProductB() {
return new ConcreteProductB2();
}
}


TAG:青峰科技 |