23種設計模式

建立型模式 結構型模式 行爲型模式
簡單工廠模式
抽象工廠模式
工廠方法模式
建造者模式
單例模式
原型模式
適配器模式
外觀模式
裝飾器模式
橋接模式
享元模式
代理模式
組合模式
模板方法模式
觀察者模式
迭代器模式
責任鏈模式
備忘錄模式
命令模式
狀態模式
訪問者模式
中介者模式
策略模式
解釋器模式

建立型模式(CreateingPattern)

幫助咱們建立對象java

簡單工廠模式(SimpleFactory)

簡單工廠模式也叫靜態工廠模式,就是工廠類通常是使用靜態方法,經過接收的參數的不一樣來返回不一樣的對象實例web

用來生產同一等級結構中的任意產品。(對於增長新的產品,須要修改已有代碼)正則表達式

工廠方法模式(Factory)

用來生產同一等級結構中的固定產品。(支持增長任意產品)算法

抽象工廠模式(AbstractFactory)

用來生產不一樣產品族的所有產品。(對於增長新的產品,無能爲力;支持增長產品族)spring

  • 工廠模式應用場景
    – JDK中Calendar的getInstance方法
    – JDBC中Connection對象的獲取
    – Hibernate中SessionFactory建立Session
    – spring中IOC容器建立管理bean對象
    – XML解析時的DocumentBuilderFactory建立解析器對象
    – 反射中Class對象的newInstance()

建造者模式(Builder)

分離了對象子組件的單獨構造(由Builder來負責)和裝配(由Director負責)。 從而能夠構造出複雜的對象。數據庫

  • 應用場景
    – StringBuilder類的append方法
    – SQL中的PreparedStatement
    – JDOM中DomBuilder、SAXBuilder

單件模式(Singleton)

保證一個類只有一個實例,而且提供一個訪問該實例的全局訪問點。編程

  • 常見的五種單例模式實現方式:
    – 主要:
    • 餓漢式(線程安全,調用效率高。 可是,不能延時加載。)
    • 懶漢式(線程安全,調用效率不高。 可是,能夠延時加載。)
    – 其餘:
    • 雙重檢測鎖式(因爲JVM底層內部模型緣由,偶爾會出問題。不建議使用)
    • 靜態內部類式(線程安全,調用效率高。 可是,能夠延時加載)
    • 枚舉單例(線程安全,調用效率高,不能延時加載)
  • 應用場景
    – Windows的Task Manager(任務管理器)
    – Windows的Recycle Bin(回收站)
    – 項目中,讀取配置文件的類
    – 網站的計數器
    – 應用程序的日誌應用(共享的日誌文件一直處於打開狀態,只能有一個實例去操做, 不然內容很差追加)
    – 數據庫鏈接池的設計通常採用單例模式
    – 操做系統的文件系統,一個操做系統只能有一個文件系統。
    – Application 也是單例應用(Servlet編程)
    – 在Spring中,每一個Bean默認是單例的,這樣作的優勢是Spring容器能夠管理
    – 在Servlet編程中,每一個Servlet是單例
    – 在Spring MVC框架/Struts1框架中,控制器對象是單例

原型模式(Prototype)

經過new產生一個對象須要很是繁瑣的數據準備或訪問權限,則可使用原型模式設計模式

  • 應用場景
    – 原型模式不多單獨出現,通常是和工廠方法模式一塊兒出現,經過clone的方法建立一個對象,而後由工廠方法提供給調用者。
    Spring中bean的建立實際就是兩種:單例模式和原型模式。(固然,原型模式須要和工廠模式搭配起來)

結構型模式(StructuralPattern)

是從程序的結構上實現鬆耦合,從而能夠擴大總體的類結構,用來解決更大的問題。關注對象和類的組織安全

適配器模式(Adapter)

將一個類的接口轉換成客戶但願的另一個接口,使本來因爲接口不兼容不能一塊兒工做的類能夠一塊兒工做ruby

  • 應用場景
    – 常常用來作舊系統改造和升級
    – java.io.InputStreamReader(InputStream)
    – java.io.OutputStreamWriter(OutputStream)

外觀模式(Facade)

爲子系統提供統一的調用接口,使得子系統更加容易使用

  • 應用場景
    – JDBC封裝後的,commons提供的DBUtils類,Hibernate提供的工具類、Spring JDBC工具類等

裝飾模式(Decorator)

動態地給一個對象添加額外的功能,比繼承靈活

  • 應用場景
    – IO中輸入流和輸出流的設計
    – Swing包中圖形界面構件功能
    – Servlet API 中提供了一個request對象的Decorator設計模式的默認實現類HttpServletRequestWrapper,HttpServletRequestWrapper 類,加強了request對象的功能。
    – Struts2中,request,response,session對象的處理

橋接模式(Bridge)

處理多層繼承結構,處理多維度變化的場景,將各個維度設計成獨立的繼承結構,使各個維度能夠獨立的擴展在抽象層創建關聯。

  • 應用場景
    – JDBC驅動程序
    – AWT中的Peer架構
    – 銀行日誌管理:格式分類和距離分類
    – 人力資源系統中的獎金計算模塊:獎金分類和部門分類
    – OA系統中的消息處理:業務類型和發送消息方式

享元模式(FlyWeight)

運用共享技術有效的實現管理大量細粒度對象,節省內存,提升效率

  • 應用場景
    – 享元模式因爲其共享的特性,能夠在任何「池」中操做(線程池、數據庫鏈接池)
    – String類

代理模式(Proxy)

爲真實對象提供一個代理,從而控制對真實對象的訪問, AOP的核心實現機制

  • 分類:
    – 靜態代理(靜態定義代理類)
    – 動態代理(動態生成代理類)
    • JDK自帶的動態代理
    • javaassist字節碼操做庫實現
    • CGLIB
    • ASM(底層使用指令,可維護性較差)

  • 做用:
    – 安全代理:屏蔽對真實角色的直接訪問。
    – 遠程代理:經過代理類處理遠程方法調用(RMI)
    – 延遲加載:先加載輕量級的代理對象,真正須要再加載真實對象。 好比開發一個大文檔查看軟件,大文檔中有大的圖片,在打開文件時不可能將全部的圖片都顯示出來,可使用代理模式,當須要查看圖片時,用proxy來進行大圖片的打開。
  • 應用場景:
    – struts2中攔截器的實現
    – 數據庫鏈接池關閉處理
    – Hibernate中延時加載的實現
    – mybatis中實現攔截器插件
    – AspectJ的實現
    – spring中AOP的實現(日誌攔截,聲明式事務處理)
    – web service
    – RMI遠程方法調用

組合模式(Composite)

將對象組合成樹狀結構以表示」部分和總體」層次結構,使得客戶能夠統一的調用葉子對象和容器對象

  • 應用場景
    – 操做系統的資源管理器
    – GUI中的容器層次圖
    – XML文件解析
    – OA系統中,組織結構的處理
    – Junit單元測試框架:底層設計是典型的組合模式,TestCase(葉子)、TestUnite(容器)、Test接口(抽象)

行爲型模式(BehavioralPattern)

關注系統中對象之間的相互交互, 研究系統在運行時對象之間的相互通訊和協做, 進一步明確對象的職責

模板模式(TemplateMethod)

定義一個操做的算法骨架,將某些易變的步驟延遲到子類中實現

  • 應用場景

    – 數據庫訪問的封裝

    – Junit單元測試

    – Servlet中關於doGet/doPost方法調用

    – Hibernate中模板程序

    – Spring中JDBCTemplate , HibernateTemplate等

觀察者模式(Oberserver)

當一個對象狀態發生改變時,其相關依賴對象皆獲得通知並被自動更新

  • 應用場景
    – 聊天室程序的,服務器轉發給全部客戶端
    – 網絡遊戲(多人聯機對戰)場景中,服務器將客戶端的狀態進行分發
    – 郵件訂閱
    – Servlet中,監聽器的實現
    – Android中,廣播機制
    – JDK的AWT中事件處理模型,基於觀察者模式的委派事件模型(Delegation Event Model)
    • 事件源----------------目標對象 • 事件監聽器------------觀察者
    – 京東商城中,羣發某商品打折信息

迭代子模式(Iterator)

提供一種能夠遍歷聚合對象的方式。又稱爲:遊標cursor模式

  • 應用場景
    – JDK內置的迭代器(List/Set)

責任鏈模式(ChainOfResponsibility)

避免請求發送者和接收者耦合,讓多個對象都有可能接收請求,將這些對象連成一條鏈,而且沿着這條鏈傳遞請求,直到有對象處理爲止

  • 應用場景
    – Java中,異常機制就是一種責任鏈模式。一個try能夠對應多個catch,當第一個catch不匹配類型,則自動跳到第二個catch.
    – Javascript語言中事件的冒泡和捕獲機制, Java語言中事件的處理都採用觀察者模式。
    – Servlet開發中,過濾器的鏈式處理
    – Struts2中,攔截器的調用也是典型的責任鏈模式

備忘錄模式(Memento)

捕獲一個對象的內部狀態,並保存之;須要時,能夠恢復到保存的狀態

  • 應用場景
    – 棋類遊戲中的,悔棋
    – 普通軟件中的,撤銷操做
    – 數據庫軟件中的,事務管理中的,回滾操做
    – Photoshop軟件中的,歷史記錄

命令模式 (Command)

將一個請求封裝爲一個對象,從而使得請求調用者和請求接收者解耦

  • 應用場景
    – Struts2中action的整個調用過程當中就有命令模式。
    – 數據庫事務機制的底層實現
    – 命令的撤銷和恢復

狀態模式(State)


容許一個對象在其內部狀態改變時改變它的行爲

  • 應用場景
    – 銀行系統中帳號狀態的管理
    – OA系統中公文狀態的管理
    – 酒店系統中房間狀態的管理
    – 線程對象各狀態之間的切換

訪問者模式(Visitor)


表示一個做用於某對象結構中的各元素的操做,它使得用戶能夠在不改變各元素的類的前提下定義做用於這些元素的新操做

  • 應用場景(應用範圍很是窄)
    – XML文檔解析器設計
    – 編譯器的設計
    – 複雜集合對象的處理

中介者模式(Mediator)


經過一箇中介對象來封裝一系列的對象交互,使得各對象不須要相互引用

  • 應用場景
    – MVC模式(其中的C:控制器就是一箇中介者對象。M和V都和他打交道)
    – 窗口遊戲程序,窗口軟件開發中窗口對象也是一箇中介者對象
    – 圖形界面開發GUI中,多個組件之間的交互,能夠經過引入一箇中介者對象來解決,能夠是總體的窗口對象或者DOM對象
    – Java.lang.reflect.Method#invoke()

策略模式(Strategy)


定義一系列算法,並將每一個算法封裝在一個類中

  • 應用場景
    – GUI編程中,佈局管理
    – Spring框架中,Resource接口,資源訪問策略
    – javax.servlet.http.HttpServlet#service()

解釋器模式(Interpreter)

描述如何爲語言定義一個文法,如何解析。主要用於使用面嚮對象語言開發的編譯器和解釋器設計。當咱們須要開發一種新的語言時, 能夠考慮使用解釋器模式。
儘可能不要使用解釋器模式,後期維護會有很大麻煩。在項目中,可使用Jruby,Groovy、java的js引擎來替代解釋器的做用,彌補java語言的不足。

  • 應用場景

    – EL表達式式的處理 – 正則表達式解釋器 – SQL語法的解釋器 – 數學表達式解析器(現成的工具包:Math Expression String Parser、Expression4J等)!

相關文章
相關標籤/搜索