常用設(shè)計(jì)模式

工廠模式

  • 意圖:定義一個(gè)創(chuàng)建對(duì)象的接口,讓其子類自己決定實(shí)例化哪一個(gè)工廠類,工廠模式使其創(chuàng)建過程延遲到子類進(jìn)行。
  • 主要解決:主要解決接口選擇的問題。
  • 何時(shí)使用:我們明確地計(jì)劃不同條件下創(chuàng)建不同實(shí)例時(shí)。
  • 如何解決:讓其子類實(shí)現(xiàn)工廠接口,返回的也是一個(gè)抽象的產(chǎn)品。
  • 關(guān)鍵代碼:創(chuàng)建過程在其子類執(zhí)行。
  • 實(shí)現(xiàn)
    • 定義一個(gè)接口:
      public interface Shape {
      void draw();
      }

    • 然后定義子類實(shí)現(xiàn)這個(gè)接口,如長(zhǎng)方形:
      public class Rectangle implements Shape {
      @Override
      public void draw() {
      System.out.println("Inside Rectangle::draw() method.");
      }
      }

    • 接著寫工廠類,傳入類型,利用不同的子類生成不同的實(shí)例,如:
      public class ShapeFactory {

         //使用 getShape 方法獲取形狀類型的對(duì)象
         public Shape getShape(String shapeType){
         if(shapeType == null){
             return null;
         }        
         if(shapeType.equalsIgnoreCase("CIRCLE")){
            return new Circle();
         } else if(shapeType.equalsIgnoreCase("RECTANGLE")){
           return new Rectangle();
         } else if(shapeType.equalsIgnoreCase("SQUARE")){
           return new Square();
         }
         return null;
         }
      } 
      

抽象工廠模式

  • 意圖:提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴對(duì)象的接口,而無需指定它們具體的類。
  • 主要解決:主要解決接口選擇的問題。
  • 何時(shí)使用:系統(tǒng)的產(chǎn)品有多于一個(gè)的產(chǎn)品族,而系統(tǒng)只消費(fèi)其中某一族的產(chǎn)品。
  • 如何解決:在一個(gè)產(chǎn)品族里面,定義多個(gè)產(chǎn)品。
  • 關(guān)鍵代碼:在一個(gè)工廠里聚合多個(gè)同類產(chǎn)品。
  • 實(shí)現(xiàn):在工廠模式的基礎(chǔ)上,多個(gè)抽象工廠類,依據(jù)需求,實(shí)現(xiàn)抽象類中不懂的工廠實(shí)例
    public abstract class AbstractFactory {
    abstract Color getColor(String color);
    abstract Shape getShape(String shape) ;
    }

單例模式

  • 意圖:保證一個(gè)類僅有一個(gè)實(shí)例,并提供一個(gè)訪問它的全局訪問點(diǎn)。
  • 主要解決:一個(gè)全局使用的類頻繁地創(chuàng)建與銷毀。
  • 何時(shí)使用:當(dāng)您想控制實(shí)例數(shù)目,節(jié)省系統(tǒng)資源的時(shí)候。
  • 如何解決:判斷系統(tǒng)是否已經(jīng)有這個(gè)單例,如果有則返回,如果沒有則創(chuàng)建。
  • 關(guān)鍵代碼:構(gòu)造函數(shù)是私有的。

原型模式

  • 意圖:用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過拷貝這些原型創(chuàng)建新的對(duì)象。
  • 主要解決:在運(yùn)行期建立和刪除原型。
  • 何時(shí)使用:
    • 1、當(dāng)一個(gè)系統(tǒng)應(yīng)該獨(dú)立于它的產(chǎn)品創(chuàng)建,構(gòu)成和表示時(shí)。
    • 2、當(dāng)要實(shí)例化的類是在運(yùn)行時(shí)刻指定時(shí),例如,通過動(dòng)態(tài)裝載。
    • 3、為了避免創(chuàng)建一個(gè)與產(chǎn)品類層次平行的工廠類層次時(shí)。
    • 4、當(dāng)一個(gè)類的實(shí)例只能有幾個(gè)不同狀態(tài)組合中的一種時(shí)。建立相應(yīng)數(shù)目的原型并克隆它們可能比每次用合適的狀態(tài)手工實(shí)例化該類更方便一些。
  • 如何解決:利用已有的一個(gè)原型對(duì)象,快速地生成和原型對(duì)象一樣的實(shí)例。

適配器模式

  • 意圖:將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
  • 如何解決:繼承或依賴(推薦)。
  • 關(guān)鍵代碼:適配器繼承或依賴已有的對(duì)象,實(shí)現(xiàn)想要的目標(biāo)接口。

代理模式

  • 意圖:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問。
  • 何時(shí)使用:想在訪問一個(gè)類時(shí)做一些控制。
  • 如何解決:增加中間層。
  • 關(guān)鍵代碼:實(shí)現(xiàn)與被代理類組合。分別實(shí)現(xiàn)兩個(gè)父類的子類,一個(gè)是具有真實(shí)功能的子類,另一個(gè)作為代理類,并且利用這個(gè)代理類來生成請(qǐng)一個(gè)子類的對(duì)象,最后利用這個(gè)對(duì)象來調(diào)用真實(shí)功能子類的方法。

觀察者模式

  • 意圖:定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。
  • 主要解決:一個(gè)對(duì)象狀態(tài)改變給其他對(duì)象通知的問題,而且要考慮到易用和低耦合,保證高度的協(xié)作。
  • 何時(shí)使用:一個(gè)對(duì)象(目標(biāo)對(duì)象)的狀態(tài)發(fā)生改變,所有的依賴對(duì)象(觀察者對(duì)象)都將得到通知,進(jìn)行廣播通知。
  • 如何解決:使用面向?qū)ο蠹夹g(shù),可以將這種依賴關(guān)系弱化。
  • 關(guān)鍵代碼:在抽象類里有一個(gè) ArrayList 存放觀察者們。

狀態(tài)模式

  • 意圖:允許對(duì)象在內(nèi)部狀態(tài)發(fā)生改變時(shí)改變它的行為,對(duì)象看起來好像修改了它的類。
  • 主要解決:對(duì)象的行為依賴于它的狀態(tài)(屬性),并且可以根據(jù)它的狀態(tài)改變而改變它的相關(guān)行為。
  • 何時(shí)使用:代碼中包含大量與對(duì)象狀態(tài)有關(guān)的條件語(yǔ)句。
  • 如何解決:將各種具體的狀態(tài)類抽象出來。
  • 關(guān)鍵代碼:通常命令模式的接口中只有一個(gè)方法,而狀態(tài)模式的接口中有一個(gè)或者多個(gè)方法。另外,狀態(tài)模式的實(shí)現(xiàn)類的方法,一般返回值,或者是改變實(shí)例變量的值。也就是說,狀態(tài)模式一般和對(duì)象的狀態(tài)有關(guān)。實(shí)現(xiàn)類的方法有不同的功能,覆蓋接口中的方法。狀態(tài)模式和命令模式一樣,也可以用于消除 if...else 等條件選擇語(yǔ)句。

策略模式

  • 意圖:定義一系列的算法,把它們一個(gè)個(gè)封裝起來, 并且使它們可相互替換。
  • 主要解決:在有多種算法相似的情況下,使用 if...else 所帶來的復(fù)雜和難以維護(hù)。
  • 何時(shí)使用:一個(gè)系統(tǒng)有許多許多類,而區(qū)分它們的只是他們直接的行為。
  • 如何解決:將這些算法封裝成一個(gè)一個(gè)的類,任意地替換。
  • 關(guān)鍵代碼:實(shí)現(xiàn)同一個(gè)接口。調(diào)用時(shí),傳入不同的策略子類實(shí)例,從而實(shí)現(xiàn)不同的策略。

訪問者模式

  • 意圖:主要將數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)操作分離。
  • 主要解決:穩(wěn)定的數(shù)據(jù)結(jié)構(gòu)和易變的操作耦合問題。
  • 何時(shí)使用:需要對(duì)一個(gè)對(duì)象結(jié)構(gòu)中的對(duì)象進(jìn)行很多不同的并且不相關(guān)的操作,而需要避免讓這些操作"污染"這些對(duì)象的類,使用訪問者模式將這些封裝到類中。
  • 如何解決:在被訪問的類里面加一個(gè)對(duì)外提供接待訪問者的接口。
  • 關(guān)鍵代碼:在數(shù)據(jù)基礎(chǔ)類里面有一個(gè)方法接受訪問者,將自身引用傳入訪問者。

MVC模式

MVC 模式代表 Model-View-Controller(模型-視圖-控制器) 模式。這種模式用于應(yīng)用程序的分層開發(fā)。

  • Model(模型) - 模型代表一個(gè)存取數(shù)據(jù)的對(duì)象或 JAVA POJO。它也可以帶有邏輯,在數(shù)據(jù)變化時(shí)更新控制器。
  • View(視圖) - 視圖代表模型包含的數(shù)據(jù)的可視化。
  • Controller(控制器) - 控制器作用于模型和視圖上。它控制數(shù)據(jù)流向模型對(duì)象,并在數(shù)據(jù)變化時(shí)更新視圖。它使視圖與模型分離開。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 設(shè)計(jì)模式匯總 一、基礎(chǔ)知識(shí) 1. 設(shè)計(jì)模式概述 定義:設(shè)計(jì)模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 4,098評(píng)論 1 15
  • Java開發(fā)中的23種設(shè)計(jì)模式詳解(轉(zhuǎn)) - maowang - 博客園 一、總體來說設(shè)計(jì)模式分為三大類: 創(chuàng)建型...
    Kevin_Curry閱讀 856評(píng)論 1 7
  • iOS常用設(shè)計(jì)模式總結(jié)(一) 設(shè)計(jì)模式大概分成三類:1.創(chuàng)建型:?jiǎn)卫O(shè)計(jì)模式、抽象工廠設(shè)計(jì)模式2.結(jié)構(gòu)型:MVC ...
    _Weak閱讀 477評(píng)論 0 3
  • 前言 很久前就一直想總結(jié)下常用的設(shè)計(jì)模式,但是各種原因一直拖到現(xiàn)在,下面我嘗試用自己的理解去解釋常用的設(shè)計(jì)模式,旨...
    老實(shí)任閱讀 750評(píng)論 0 1
  • 設(shè)計(jì)模式基本原則 開放-封閉原則(OCP),是說軟件實(shí)體(類、模塊、函數(shù)等等)應(yīng)該可以拓展,但是不可修改。開-閉原...
    西山薄涼閱讀 4,086評(píng)論 3 14

友情鏈接更多精彩內(nèi)容