設計模式思考 I

前言

最近復習設計模式茁帽,花了不少時間玉罐,由于項目經(jīng)驗還比較少,雖然看得懂潘拨,能理解吊输,但鑒于個人比較偏實踐,不善于記憶铁追,隔一段時間后季蚂,卻很快就忘記了o(╯□╰)o,到真正自己說的時候也說不出來……與其看別人的總結琅束,不如自己再根據(jù)別人的博客再思考整理一番扭屁,或許這樣比反復看的效果會好些吧。下面是根據(jù)別人的博客和以下幾點思考方式來重新整理的筆記:
1.這種模式怎么理解涩禀?(盡量簡單易懂)
2.類圖怎樣畫疯搅?(代碼怎樣寫)
3.舉個栗子?(使用場景)
4.使用這種模式有什么優(yōu)缺點埋泵?(遵循什么原則)

相關代碼示例地址: navyifanr/AndroidTrainingDemo/DesignPattern

設計模式六大原則

1.開閉原則(Open Close Principle)
開閉原則就是說對擴展開放幔欧,對修改關閉。在程序需要進行拓展的時候丽声,不能去修改原有的代碼礁蔗,實現(xiàn)一個熱插拔的效果。所以一句話概括就是:為了使程序的擴展性好雁社,易于維護和升級浴井。想要達到這樣的效果,我們需要使用接口和抽象類霉撵,后面的具體設計中我們會提到這點磺浙。
參考:https://realm.io/cn/news/donn-felker-solid-part-2/

2.里氏代換原則(Liskov Substitution Principle)
里氏代換原則(Liskov Substitution Principle LSP)面向對象設計的基本原則之一洪囤。 里氏代換原則中說,任何基類可以出現(xiàn)的地方撕氧,子類一定可以出現(xiàn)瘤缩。 LSP是繼承復用的基石,只有當衍生類可以替換掉基類伦泥,軟件單位的功能不受到影響時剥啤,基類才能真正被復用,而衍生類也能夠在基類的基礎上增加新的行為不脯。里氏代換原則是對“開-閉”原則的補充府怯。實現(xiàn)“開-閉”原則的關鍵步驟就是抽象化。而基類與子類的繼承關系就是抽象化的具體實現(xiàn)防楷,所以里氏代換原則是對實現(xiàn)抽象化的具體步驟的規(guī)范牺丙。—— From Baidu 百科
參考:https://realm.io/cn/news/donn-felker-solid-part-3/

3.依賴倒轉原則(Dependence Inversion Principle)
這個是開閉原則的基礎复局,具體內(nèi)容:真對接口編程冲簿,依賴于抽象而不依賴于具體。
參考:https://realm.io/cn/news/donn-felker-solid-part-5/

4.接口隔離原則(Interface Segregation Principle)
這個原則的意思是:使用多個隔離的接口肖揣,比使用單個接口要好民假。還是一個降低類之間的耦合度的意思浮入,從這兒我們看出龙优,其實設計模式就是一個軟件的設計思想,從大型軟件架構出發(fā)事秀,為了升級和維護方便彤断。所以上文中多次出現(xiàn):降低依賴,降低耦合易迹。
參考:https://realm.io/cn/news/donn-felker-solid-part-4/

5.迪米特法則(最少知道原則)(Demeter Principle)
為什么叫最少知道原則宰衙,就是說:一個實體應當盡量少的與其他實體之間發(fā)生相互作用,使得系統(tǒng)功能模塊相對獨立睹欲。

6.合成復用原則(Composite Reuse Principle)
原則是盡量使用合成/聚合的方式供炼,而不是使用繼承。

模式分類

創(chuàng)建型:單例模式窘疮、簡單工廠模式袋哼、工廠方法模式、抽象工廠模式闸衫、建造者模式涛贯、原型模式;
結構型:代理模式蔚出、適配器模式弟翘、裝飾器模式虫腋、橋接模式、組合模式稀余、享元模式悦冀、外觀模式;
行為型:觀察者模式滚躯、模板方法模式雏门、命令模式、狀態(tài)模式掸掏、職責鏈模式茁影、解釋器模式 、中介者模式丧凤、訪問者模式募闲、策略模式搓逾、備忘錄模式澈歉、迭代器模式奢米;

創(chuàng)建者模式

1.單例模式(Singleton)

(1)理解:
保證一個類僅有一個實例林说,并提供一個獲得該實例的方法(必須是靜態(tài)方法吮成,通常用getInstance命名)

(2)類圖:

單例模式.png

常使用的實現(xiàn)方法是這兩種稽物,懶漢單例模式和DCL單例模式可參考巢价,單例設計模式的N中Java實現(xiàn)方法

(3)栗子:
android中有很多系統(tǒng)級別的全局變量倒得,如時間农渊,輸入法患蹂,如InputMethodManager,賬戶砸紊,狀態(tài)欄等传于,android中對這些都直接或者有些間接用到了單例模式。

(4)優(yōu)缺點:
餓漢式:
優(yōu):線程安全醉顽,調(diào)用時反應速度快沼溜,在類加載的同時已經(jīng)創(chuàng)建好了一個靜態(tài)對象(創(chuàng)建的唯一對象);
缺:資源利用效率不高游添,可能該實例并不需要系草,但也被系統(tǒng)加載了,在一些場景下是無法使用的唆涝,比如找都,如果Single實例的創(chuàng)建依賴參數(shù)或配置文件,則在getInstance()之前必須調(diào)用某個方法來設置這些參數(shù)石抡,但在設置之前檐嚣,可能已經(jīng)new了Single實例;static 內(nèi)部類式:
優(yōu):線程安全,資源利用率高,不執(zhí)行getInstance就不會被實例嚎京。
缺:第一次加載時反應不快嗡贺。

總之,單例模式鞍帝,省去了new操作符诫睬,降低了系統(tǒng)內(nèi)存的使用頻率,減輕GC壓力帕涌;有些類如交易所的核心交易引擎摄凡,控制著交易流程,如果該類可以創(chuàng)建多個的話蚓曼,系統(tǒng)容易亂亲澡,使用單例模式,才能保證核心交易服務器獨立控制整個流程纫版。

2.簡單工廠模式

(1)理解
建立一個工廠類床绪,對實現(xiàn)了同一接口的一些類進行實例的創(chuàng)建。

(2)類圖

簡單工廠模式.png

(3)栗子
出現(xiàn)了大量的產(chǎn)品需要創(chuàng)建其弊,并且具有共同的接口時使用癞己,但一般采用工廠方法模式。

(4)優(yōu)缺點
優(yōu):簡單粗暴
缺:如果傳入的字符串有誤梭伐,不能正確創(chuàng)建對象痹雅,而且代碼比較臃腫,擴展性不強糊识。

3.工廠方法模式(Factory Method)

(1)理解

用于創(chuàng)建對象的接口绩社,讓子類決定實例化哪個類。工廠方式模式使一個類的實例化延遲到其子類技掏。
(2)類圖

工廠方法模式.png

(3)栗子
如铃将,Java的ThreadFactory项鬼。希望工廠與產(chǎn)品的種類對客戶端保持透明哑梳,給客戶端提供一致的操作,另外一種是不同的工廠和產(chǎn)品可以提供客戶端不同的服務或功能绘盟。

(4)優(yōu)缺點
優(yōu):可派生多個產(chǎn)品鸠真,容易擴展性,遵循單一職責龄毡、依賴倒置
缺:類的創(chuàng)建依賴工廠類吠卷,也就是說,如果想要拓展程序沦零,必須對工廠類進行修改祭隔,這違背了閉包原則,所以可以考慮使用抽象工廠模式路操。

4.抽象工廠模式(Abstract Factory)

(1)理解
創(chuàng)建多個工廠類疾渴,一旦需要增加新的功能千贯,直接增加新的工廠類就可以了,不需要修改之前的代碼搞坝。

(2)類圖


UML-AbstractFactory.png

(3)栗子
如Java的List接口搔谴,軟件的換皮膚功能;需要一個接口可以提供一個產(chǎn)品族桩撮,且不必知道產(chǎn)品的具體種類

(4)優(yōu)缺點
優(yōu):遵循單一職責敦第、依賴倒置、開閉原則店量,當需要擴展一個功能時芜果,只需做一個實現(xiàn)類,實現(xiàn)Sender接口融师,同時做一個工廠類师幕,實現(xiàn)Provider接口,就OK了诬滩,無需去改動現(xiàn)成的代碼霹粥。

注:
三種工廠模式的區(qū)別:
簡單工廠:用來生產(chǎn)同一等級結構中的任意產(chǎn)品,對于增加新的產(chǎn)品疼鸟,無能為力后控。
工廠方法:用來生產(chǎn)同一等級結構中的固定產(chǎn)品,支持增加任意產(chǎn)品空镜。
抽象工廠:用來生產(chǎn)不同產(chǎn)品族(由不同產(chǎn)品組合成的一套產(chǎn)品)的全部產(chǎn)品浩淘,對于增加新的產(chǎn)品,無能為力吴攒;支持增加產(chǎn)品族张抄。

參考:抽象工廠模式詳解

5.建造者模式(Builder)

(1)理解
將一個復雜對象的構建和它的表示分離,使得同樣的創(chuàng)建過程可以創(chuàng)建不同的表示洼怔。
工廠類模式提供的是創(chuàng)建單個類的模式署惯,而建造者模式則是將各種產(chǎn)品集中起來進行管理,用來創(chuàng)建復合對象镣隶,所謂復合對象就是指某個類具有不同的屬性极谊,其實建造者模式就是前面抽象工廠模式和最后的Test結合起來得到的。
(2)類圖

UML-Builder.png

或許安岂,《Effective Java》的例子更好轻猖,遇到多個構造參數(shù)時要考慮用構建器(Builder模式):

class NutritionFacts {
    private final int servingSize;
    private final int servings;
    private final int calories;
    private final int fat;
    private final int sodium;
    private final int carbohydrate;
    public static class Builder {
        //對象的必選參數(shù)
        private final int servingSize;
        private final int servings;
        //對象的可選參數(shù)的缺省值初始化
        private int calories = 0;
        private int fat = 0;
        private int carbohydrate = 0;
        private int sodium = 0;
        //只用少數(shù)的必選參數(shù)作為構造器的函數(shù)參數(shù)
        public Builder(int servingSize,int servings) {
            this.servingSize = servingSize;
            this.servings = servings;
        }
        public Builder calories(int val) {
            calories = val;
            return this;
        }
        public Builder fat(int val) {
            fat = val;
            return this;
        }
        public Builder carbohydrate(int val) {
            carbohydrate = val;
            return this;
        }
        public Builder sodium(int val) {
            sodium = val;
            return this;
        }
        public NutritionFacts build() {
            return new NutritionFacts(this);
        }
    }
    private NutritionFacts(Builder builder) {
        servingSize = builder.servingSize;
        servings = builder.servings;
        calories = builder.calories;
        fat = builder.fat;
        sodium = builder.sodium;
        carbohydrate = builder.carbohydrate;
    }
}
//使用方式
public static void main(String[] args) {
    NutritionFacts cocaCola = new NutritionFacts.Builder(240, 8).calories(100)
        .sodium(35).carbohydrate(27).build();
    System.out.println(cocaCola);
}

(3)栗子
android中大量的使用對話框組件,它的調(diào)用方法就是構建域那,拼接咙边,表示。

Android-Builder.jpeg

Builder通過setTitle(),setMessage(),setIcon()等方法在create()中構造出一個AlertDialogInstance對象。
然后客戶可以把把AlertDialogInstance對象show出去败许。

附: Android用建造者模式實現(xiàn)一個新功能引導頁

(4)優(yōu)缺點
優(yōu):復用對象友瘤,避免不斷new構造者增加開銷;將很多功能集成到一個類里檐束,創(chuàng)造出比較復雜的東西辫秧。

6.原型模式

(1)理解
用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象被丧。

(2)類圖

注:克隆操作分深拷貝和淺拷貝盟戏,淺拷貝說白了就是把原對象所有的值和引用直接賦給新對象。深拷貝則不僅把原對象的值賦給新對象甥桂,而且會把原對象的引用對象也重新創(chuàng)建一遍再賦給新對象柿究。

(3)栗子
如Java的Cloneable接口。
使用場景:a.對象的創(chuàng)建非常復雜黄选,可以使用原型模式快捷的創(chuàng)建對象蝇摸。b.在運行過程中不知道對象的具體類型,可使用原型模式創(chuàng)建一個相同類型的對象办陷,或者在運行過程中動態(tài)的獲取到一個對象的狀態(tài)貌夕。

(4)優(yōu)缺點
缺:每個原型的子類都必須實現(xiàn)Cloneable接口,這個實現(xiàn)起來有時候比較困難民镜。

詳細:原型模式詳解(clone方法源碼的簡單剖析)

持續(xù)更新啡专,整理得不對的地方,還望指正制圈!

參考:
1.Java之美[從菜鳥到高手演變]之設計模式-終點
2.Android設計模式系列-謙虛天下
3.設計模式系列-Tony Chen
4.設計模式詳解-左瀟龍
5.設計模式UML類圖

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末们童,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鲸鹦,更是在濱河造成了極大的恐慌慧库,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件馋嗜,死亡現(xiàn)場離奇詭異齐板,居然都是意外死亡,警方通過查閱死者的電腦和手機嵌戈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門覆积,熙熙樓的掌柜王于貴愁眉苦臉地迎上來听皿,“玉大人熟呛,你說我怎么就攤上這事∥疽蹋” “怎么了庵朝?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我九府,道長椎瘟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任侄旬,我火速辦了婚禮肺蔚,結果婚禮上,老公的妹妹穿的比我還像新娘儡羔。我一直安慰自己宣羊,他們只是感情好,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布汰蜘。 她就那樣靜靜地躺著仇冯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪族操。 梳的紋絲不亂的頭發(fā)上苛坚,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天,我揣著相機與錄音色难,去河邊找鬼泼舱。 笑死,一個胖子當著我的面吹牛枷莉,可吹牛的內(nèi)容都是我干的柠掂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼依沮,長吁一口氣:“原來是場噩夢啊……” “哼涯贞!你這毒婦竟也來了?” 一聲冷哼從身側響起危喉,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤宋渔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辜限,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皇拣,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年薄嫡,在試婚紗的時候發(fā)現(xiàn)自己被綠了氧急。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡毫深,死狀恐怖吩坝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哑蔫,我是刑警寧澤钉寝,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布弧呐,位于F島的核電站,受9級特大地震影響嵌纲,放射性物質(zhì)發(fā)生泄漏俘枫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一逮走、第九天 我趴在偏房一處隱蔽的房頂上張望鸠蚪。 院中可真熱鬧,春花似錦师溅、人聲如沸邓嘹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽汹押。三九已至,卻和暖如春起便,著一層夾襖步出監(jiān)牢的瞬間棚贾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工榆综, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留妙痹,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓鼻疮,卻偏偏與公主長得像怯伊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子判沟,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 設計模式匯總 一耿芹、基礎知識 1. 設計模式概述 定義:設計模式(Design Pattern)是一套被反復使用、多...
    MinoyJet閱讀 3,922評論 1 15
  • 一挪哄、設計模式的分類 總體來說設計模式分為三大類: 創(chuàng)建型模式吧秕,共五種:工廠方法模式、抽象工廠模式迹炼、單例模式砸彬、建造者...
    RamboLI閱讀 748評論 0 1
  • 面向對象設計的五大原則 單一職責原則(SRP) 一個類應該僅有一個職責。 開放封閉原則(OCP) 對擴展開放斯入,...
    LiuHDme閱讀 1,455評論 0 3
  • 一砂碉、設計模式的分類 總體來說設計模式分為三大類: 創(chuàng)建型模式,共五種:工廠方法模式刻两、抽象工廠模式增蹭、單例模式、建造者...
    lichengjin閱讀 890評論 0 8
  • 原文鏈接:http://blog.csdn.net/zhangerqing http://www.cnblogs....
    孤獨雜貨鋪閱讀 1,509評論 0 3