常用設計模式

工廠模式

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

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

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

         //使用 getShape 方法獲取形狀類型的對象
         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;
         }
      } 
      

抽象工廠模式

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

單例模式

  • 意圖:保證一個類僅有一個實例,并提供一個訪問它的全局訪問點。
  • 主要解決:一個全局使用的類頻繁地創建與銷毀。
  • 何時使用:當您想控制實例數目,節省系統資源的時候。
  • 如何解決:判斷系統是否已經有這個單例,如果有則返回,如果沒有則創建。
  • 關鍵代碼:構造函數是私有的。

原型模式

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

適配器模式

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

代理模式

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

觀察者模式

  • 意圖:定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新。
  • 主要解決:一個對象狀態改變給其他對象通知的問題,而且要考慮到易用和低耦合,保證高度的協作。
  • 何時使用:一個對象(目標對象)的狀態發生改變,所有的依賴對象(觀察者對象)都將得到通知,進行廣播通知。
  • 如何解決:使用面向對象技術,可以將這種依賴關系弱化。
  • 關鍵代碼:在抽象類里有一個 ArrayList 存放觀察者們。

狀態模式

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

策略模式

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

訪問者模式

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

MVC模式

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

  • Model(模型) - 模型代表一個存取數據的對象或 JAVA POJO。它也可以帶有邏輯,在數據變化時更新控制器。
  • View(視圖) - 視圖代表模型包含的數據的可視化。
  • Controller(控制器) - 控制器作用于模型和視圖上。它控制數據流向模型對象,并在數據變化時更新視圖。它使視圖與模型分離開。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,885評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,312評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,993評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,667評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,410評論 6 411
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,778評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,775評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,955評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,521評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,266評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,468評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,998評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,696評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,095評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,385評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,193評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,431評論 2 378

推薦閱讀更多精彩內容

  • 設計模式匯總 一、基礎知識 1. 設計模式概述 定義:設計模式(Design Pattern)是一套被反復使用、多...
    MinoyJet閱讀 3,961評論 1 15
  • Java開發中的23種設計模式詳解(轉) - maowang - 博客園 一、總體來說設計模式分為三大類: 創建型...
    Kevin_Curry閱讀 819評論 1 7
  • iOS常用設計模式總結(一) 設計模式大概分成三類:1.創建型:單例設計模式、抽象工廠設計模式2.結構型:MVC ...
    _Weak閱讀 421評論 0 3
  • 前言 很久前就一直想總結下常用的設計模式,但是各種原因一直拖到現在,下面我嘗試用自己的理解去解釋常用的設計模式,旨...
    老實任閱讀 661評論 0 1
  • 設計模式基本原則 開放-封閉原則(OCP),是說軟件實體(類、模塊、函數等等)應該可以拓展,但是不可修改。開-閉原...
    西山薄涼閱讀 3,843評論 3 14