java常見設計模式簡要總結


設計模式六大原則

1.開放封閉原則:對擴展開放,對修改封閉,意即程序拓展時不要動原有的代碼

2.LSP原則:任何基類可以出現的地方,子類一定可以出現

3.依賴倒置原則:使用接口,依賴於抽象而不是具體

4.接口隔離原則:為了解耦,使用多個相互隔離的接口

5.迪米特法則:一個實體應當盡量少地與其他實體之間發生相互作用,使得系統功能模塊相對獨立。

6.CRP法則:盡量使用合成/聚合的方式,而不是使用繼承。

 

分類

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)

 

工廠模式

現在要創建一些對象,他們都實現了某個接口或者繼承了某個類。我們不在需要的時候使用new操作符,而是把創建的操作讓一個“工廠類”完成,我們在需要新對象時只需要把需要的東西的名字以參數形式傳遞給工廠類就行了,而不用去管怎么創建的。

抽象工廠模式

在工廠模式中,一個工廠類只生產實現某個接口或者繼承了某個類的對象,也就是具體工廠生產具體對象,如果建立一個抽象工廠類和若干個具體工廠,每個具體工廠負責產生一類對象,就成了抽象工廠模式。就是一個抽象工廠類可以生產多種類型的對象,具體每種類型的對象怎么生成,要用一個專門的工廠類來決定。

單例模式

一個類,他雖然有構造方法,但是把它設定為private,不能被外界使用。這個類只存在一個實例,保存在這個類自己的一個靜態字段里,如果要用這個類的實例屬性、實例方法,都通過這個靜態字段訪問這個唯一的實例來實現。

建造者模式

現在要創建一個很復雜的對象,我們把這個工作分開來做,先定義並實現一個建造者類,在這個類中實現構建這個對象所需要的全部方法。再定義並實現一個導演類,把一個建造者類傳給它,讓它負責這些方法調用的邏輯次序和對象的組合,然后統一給客戶端返回一個生成好的復雜對象。

原型模式

已經有了一個對象了,我們創建對象時直接復制它,不需要新建了。

適配器模式

一個類和另一個類有一些相似的操作,但是它們的形式是不一致的,需要有一個東西把它包裹起來,變成另一種比較合適的形式。

  • 類適配:創建新類,繼承源類,並實現新接口,例如 
    class  adapter extends oldClass  implements newFunc{}
  • 對象適配:創建新類持源類的實例,並實現新接口,例如 
    class adapter implements newFunc { private oldClass oldInstance ;}
  • 接口適配:創建新的抽象類實現舊接口方法。例如 
    abstract class adapter implements oldClassFunc { void newFunc();}

裝飾器模式

一個類有一些方法,但是我們想讓這些方法調用的時候多執行一些東西,於是可以定義一個裝飾器的類,它和被修飾的類同時一個類的子類或是一個接口的實現,然后將這個被修飾的類委托給這個裝飾器類,如果想使用這個修飾后的方法,只需要調用這個修飾器的方法就可以了。

代理模式

我想訪問一個對象,但是這個對象出於多種考慮,比如細節復雜、需要控制訪問、隱藏細節等,不能讓別人直接使用,必須要使用一個中間層性質的代理類,對這個對象的所有訪問都由這個代理類來完成。

外觀模式

我現在有一個成套的系統,有若干接口、類,但是直接操作這些類是一個很復雜的過程,於是額外再定義一個總結性質的類,給幾個比較有概括性的、簡潔的方法去操作這個系統,以此來簡化訪問。

橋接模式

如果我現在有一個抽象的父類,和一些具體的子類,本來他們應該是一個繼承的關系,但我認為這樣會使兩個類耦合過緊,於是強行使用委派、組合的方式,使兩者可以相對獨立的變化。具體就是在抽象類中實現一些基本操作,然后把一些需要細分的操作委派出去,可以把那些原來的子類統一到一個接口里,然后把這個接口和原來的父類組合。

組合模式

定義一個比較寬泛的類,一個具體的對象屬於這個類,把這些具體的對象按一定方式組合起來也屬於這個類。

享元模式

很多對象都需要用同一個對象,但他們都自己創建了一份保存,這樣會造成內存大量浪費。把這一部分抽出來,只創建一份,供這些對象共同使用,就可以節省內存。

觀察者模式

一組對象依賴於某一個對象,這個對象的狀態的更新會影響這一組對象,於是把這組對象稱為觀察者,放在被觀察者一個不定長數組的字段里,兩者分別保存對方的引用,被觀察者更新時會調用觀察者的方法來提醒觀察者。

訪問者模式

我現在有一個類,上面有一些操作,但是我不想把它寫到這個類里,所以我把這個功能單獨拿出來,需要執行這個功能的時候,把這個類的引用給那個功能類,讓那個功能類操作這個類。

狀態模式

一個類,他的一些操作的具體過程是根據它當前的狀態來決定的,而這個狀態取決於當前環境的上下文。

備忘錄模式

對一個類的對象的狀態進行可持久化處理,方法是另外設立一個備忘錄類,記錄狀態的變化過程,然后就可以恢復到某個歷史狀態。

策略模式

對於一個操作,實現它的算法有很多,我把這些算法每個都建立一個類,實現那個方法類的接口,在需要執行這個操作的地方,要運用某個算法,只需要把那個算法對應的類傳進去就行了。

模板模式

一個操作,它的每一步可能有細節上的區別,但是它的大概框架是確定的,在執行各個步驟的時候,先用一些抽象類放在對應的位置,等隨后再定義一些具體類去填充它。

迭代器模式

一個類,里面有一組元素,要按照某個次序一次訪問這些元素,於是單獨設立一個迭代器,無需暴露內部復雜實現,直接告訴你當前是哪個元素、下一個是哪個元素,就可以按照這種特定次序遍歷這些元素了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM