1. 程式人生 > 其它 >軟體設計模式三大類

軟體設計模式三大類

建立型

  • 工廠模式與抽象工廠模式 (Factory Pattern)(Abstract Factory Pattern)
  • 單例模式 (Singleton Pattern)
  • 建造者模式 (Builder Pattern)
  • 原型模式 (Prototype Pattern)

1、工廠方法模式

工廠方法模式的建立是因為簡單工廠模式有一個問題,在簡單工廠模式中類的建立依賴工廠類,如果想要拓展程式,必須對工廠類進行修改,這違背了開閉原則,所以就出現了工廠方法模式,只需要建立一個工廠介面和多個工廠實現類。

子類可以自己決定例項化哪一個工廠類,client類針對抽象介面進行程式設計,如果需要增加新的功能,繼承工廠介面,直接增加新的工廠類就可以了,建立過程延遲到子類中進行,不需要修改之前的程式碼,滿足了開閉原則,達到靈活地生產多種物件。

2、抽象工廠模式

抽象工廠模式是提供一個建立一系列相關或相互依賴物件的介面,而無需指定它們具體的類。區別於工廠方法模式的地方,工廠方法模式是建立一個工廠,可以實現多種物件;而抽象工廠模式是提供一個抽象工廠介面,裡面定義多種工廠,每個工廠可以生產多種物件。

前者的重點在於"怎麼生產",後者的重點在於"生產哪些";前者是一個抽象產品類,可以派生出多個具體產品類,後者是多個抽象產品類,每個抽象產品類可以派生出多個具體產品類。

3、單例模式

單例模式能保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點,同時在類內部創造單一物件,通過設定許可權,使類外部無法再創造物件。單例物件能保證在一個JVM中,該物件只有一個例項存在。

在建立的時候,省去了new操作符,降低了系統記憶體的使用頻率,減輕了系統的壓力。同時單例模式保證在一個jvm中僅存在一個例項的好處就在於好比一個軍隊當中只會存在一個最高級別的軍官來指揮整個軍隊,這樣才能保證獨立控制整個過程,否則如果出現多個,肯定會雜亂無序。

4、建造者模式

建造者模式是將一個複雜的構建與其表示相分離,使得同樣的構建過程可以建立不同的表示。在程式當中就是將一些不會變的基本元件,通過builder來進行組合,構建複雜物件,實現分離。

這樣做的好處就在於客戶端不必知道產品內部組成的細節;同時具體的建造者類之間是相互獨立的,對系統的擴充套件非常有利,滿足開閉原則;由於具體的建造者類是獨立的,因此可以對建造過程逐步細化,而不對其他的模組產生任何影響。

5、原型模式

原型模式是用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。其實就是將物件複製了一份並返還給呼叫者,物件需繼承Cloneable並重寫clone()方法。原型模式的思想就是將一個物件作為原型,對其進行復制、克隆,產生一個和原物件類似的新物件。

分為淺複製和深複製,前者是將一個物件複製後,基本資料型別的變數都會重新建立,而引用型別,指向的還是原物件所指向的;後者是將一個物件複製後,不論是基本資料型別還有引用型別,都是重新建立的。

結構型

  • 介面卡模式 (Adapter Pattern)
  • 裝飾器模式 (Decorator Pattern)
  • 橋接模式 (Bridge Pattern)
  • 外觀模式 (Facade Pattern)
  • 代理模式 (Proxy Pattern)
  • 過濾器模式 (Filter、Criteria Pattern)
  • 組合模式 (Composite Pattern)
  • 享元模式 (Flyweight Pattern)

1、介面卡模式

介面卡模式是使得原本由於介面不相容而不能一起工作的那些類可以一起工作,銜接兩個不相容、獨立的介面的功能,使得它們能夠一起工作,介面卡起到中介的作用。

2、裝飾模式

裝飾器模式是動態地給一個物件新增一些額外的職責,給一個物件增加一些新的功能,要求裝飾物件和被裝飾物件實現同一個介面,裝飾物件持有被裝飾物件的例項。除了動態的增加,也可以動態的撤銷,要做到動態的形式,不可以用繼承實現,因為繼承是靜態的。

3、代理模式

代理模式是為其他物件提供一種代理以控制對這個物件的訪問,也就是建立類的代理類,間接訪問被代理類的過程中,對其功能加以控制。

它和裝飾器模式的區別在於,裝飾器模式為了增強功能,而代理模式是為了加以控制。代理模式就是多一個代理類出來,替原物件進行一些操作,例如買火車票不一定在火車站買,也可以去代售點。再比如打官司需要請律師,因為律師在法律方面有專長,可以替我們進行操作。

4、外觀模式

外觀模式是為子系統中的一組介面提供一個一致的介面,外觀模式定義了一個高層介面,這個介面使得這一子系統更加容易使用。

在客戶端和複雜系統之間再加一層,提供一個容易使用的外觀層。外觀模式是為了解決類與類之家的依賴關係的,外觀模式就是將他們的關係放在一個Facade類中,降低了類類之間的耦合度,比如搜狐入口網站,就利用了外觀模式。

5、橋接模式

橋接模式是將抽象部分與實現部分分離,使它們都可以獨立的變化。橋接模式就是把事物和其具體實現分開,使他們可以各自獨立的變化(突然聯想到了mvc模式)。

將抽象化與實現化解耦,使得二者可以獨立變化,就好比現在常說的mvc模式,view和model之間通過control來控制,達到高內聚低耦合來解耦的目的。

6、組合模式

組合模式是將物件組合成樹形結構以表示"部分-整體"的層次結構,組合模式使得使用者對單個物件和組合物件的使用具有一致性。

建立了一個包含自己物件組的類,並提供修改物件組的方法。在系統的檔案和資料夾的問題上就使用了組合模式,檔案下不可以有物件,而資料夾下可以有檔案物件或者資料夾物件。

7、享元模式

享元模式是運用共享技術有效地支援大量細粒度的物件。享元模式的主要目的是實現物件的共享,即共享池,當系統中物件多的時候可以減少記憶體的開銷,重用現有的同類物件,若未找到匹配的物件,則建立新物件,這樣可以減少物件的建立,降低系統記憶體,提高效率。

行為型

  • 策略模式(Strategy Pattern)
  • 模板模式(Template Pattern)
  • 觀察者模式(Observer Pattern)
  • 迭代器模式(Iterator Pattern)
  • 責任鏈模式(Chain of Responsibility Pattern)
  • 命令模式(Command Pattern)
  • 備忘錄模式(Memento Pattern)
  • 狀態模式(State Pattern)
  • 中介者模式(Mediator Pattern)
  • 空物件模式(Null Object Pattern)
  • 直譯器模式(Interpreter Pattern)

1、策略模式

策略模式是定義一系列的演算法,把它們一個個封裝起來, 並且使它們可相互替換,且演算法的變化不會影響到使用演算法的客戶。

為了統一介面下的一系列演算法類(也就是多種策略),用一個類將其封裝起來,使這些策略可動態切換。策略模式屬於行為型模式,是為了使這些策略可以相互切換,是為了選擇不同的行為。

2、模版方法模式

模板方法模式是定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。該模式就是在一個抽象類中,有一個主方法,再定義1...n個方法,可以是抽象的,也可以是實際的方法,定義一個類,繼承該抽象類,重寫抽象方法,通過呼叫抽象類,實現對子類的呼叫。

模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟,將一些固定步驟、固定邏輯的方法封裝成模板方法。呼叫模板方法即可完成那些特定的步驟。

3、觀察者模式

觀察者模式是定義物件間的一種一對多的依賴關係,當一個物件的狀態發生改變時,所有依賴於它的物件都得到通知並被自動更新。

也就是當被觀察者狀態變化時,通知所有觀察者,這種依賴方式具有雙向性,在QQ郵箱中的郵件訂閱和RSS訂閱,當用戶瀏覽一些部落格時,經常會看到RSS圖示,簡單來說就是當訂閱了該文章,如果後續有更新,會及時通知使用者。這種現象即是典型的觀察者模式。

4、迭代器模式

迭代器模式是提供一種方法順序訪問一個聚合物件中各個元素, 而又無須暴露該物件的內部表示。

在Java當中,將聚合類中遍歷各個元素的行為分離出來,封裝成迭代器,讓迭代器來處理遍歷的任務;使簡化聚合類,同時又不暴露聚合類的內部,在我們經常使用的JDK中各個類也都是這些基本的東西。

5、責任鏈模式

責任鏈模式是避免請求傳送者與接收者耦合在一起,讓多個物件都有可能接收請求,將這些物件連線成一條鏈,並且沿著這條鏈傳遞請求,直到有物件處理它為止。有多個物件,每個物件持有對下一個物件的引用,這樣就會形成一條鏈,請求在這條鏈上傳遞,直到某一物件決定處理該請求。

但是發出者並不清楚到底最終那個物件會處理該請求。在生活中學生進行請假的過程中,會涉及到,學生請假會一級一級往上批,最終處理,具體由誰批准可能不清楚。在程式當中,現在使用的struts攔截器即用到了責任鏈模式。

6、命令模式

命令模式是將一個請求封裝成一個物件,從而使發出者可以用不同的請求對客戶進行引數化。模式當中存在呼叫者、接收者、命令三個物件,實現請求和執行分開;呼叫者選擇命令釋出,命令指定接收者。

7、備忘錄模式

備忘錄模式是在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。建立一個備忘錄類,用來儲存原始類的資訊;同時建立備忘錄倉庫類,用來儲存備忘錄類,主要目的是儲存一個物件的某個狀態,以便在適當的時候恢復物件,也就是做個備份。

在系統當中使用的撤銷操作,即是使用了備忘錄模式,系統可以儲存有限次數的檔案狀態,使用者可以進行上幾個狀態的恢復,也就是用到了備忘錄模式。

8、狀態模式

狀態模式是允許物件在內部狀態發生改變時改變它的行為。物件具有多種狀態,且每種狀態具有特定的行為。

在網站的積分系統中,使用者具有不同的積分,也就對應了不同的狀態;還有QQ的使用者狀態有幾種狀態,線上、隱身、忙碌等,每個狀態對應不同的操作,而且你的好友也能看到你的狀態。

9、訪問者模式

訪問者模式主要是將資料結構與資料操作分離。在被訪問的類裡面加一個對外提供接待訪問者的介面,訪問者封裝了對被訪問者結構的一些雜亂操作,解耦結構與演算法,同時具有優秀的擴充套件性。通俗來講就是一種分離物件資料結構與行為的方法。

通過這種分離,可達到為一個被訪問者動態新增新的操作而無需做其它的修改的效果。訪問者模式的優點是增加操作很容易,因為增加操作意味著增加新的訪問者。訪問者模式將有關行為集中到一個訪問者物件中,其改變不影響系統資料結構。

10、中介者模式

中介者模式是用一箇中介物件來封裝一系列的物件互動,中介者使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動。

例如,MVC模式中control就是model和view的中介者。與介面卡區別在於,介面卡是為了相容不同的介面,而中介者是為了將顯示和操作分離。

11、直譯器模式

直譯器模式是給定一個語言,定義它的文法表示,並定義一個直譯器,這個直譯器使用該標識來解釋語言中的句子,基本也就用在這個範圍內,適用面較窄,例如:正則表示式的解釋等。

本文來自部落格園,作者:黑bky,轉載請註明原文連結:https://www.cnblogs.com/zcjbky/p/15628504.html