還有設(shè)計模式這種東西嘛。。。
設(shè)計模式自學指南,幾分鐘掌握學習重點
大家好,我是魚皮,前段時間我在 B 站發(fā)布了一個【設(shè)計模式】的導(dǎo)學視頻。不出所料,無論我怎么改標題,這個視頻的播放量都無比慘淡,側(cè)面反映了設(shè)計模式?jīng)]有那么大眾化吧。。。
我感覺還是挺遺憾的,明明是一個軟件開發(fā)人員必備的重點知識技能,但是卻沒有像算法、計網(wǎng)之類的那么流行。而且看了評論區(qū)后,我發(fā)現(xiàn)別說很多同學沒有系統(tǒng)學習過它,甚至都不知道有設(shè)計模式這么個東西!

所以這篇文章是希望給大家強調(diào)一下設(shè)計模式的重要性,并且分享一下我自學設(shè)計模式的經(jīng)驗。
主要是以下幾個問題:
設(shè)計模式是什么?有什么用?為什么要學它? 什么時候?qū)W? 要學什么知識?哪些是重點? 怎么學?有哪些方法和資源? 以及面試的時候可能會考什么?
花幾分鐘了解這幾個問題后,再去學設(shè)計模式,相信能幫助大家抓住重點,節(jié)省時間、更高效地自學。
什么是設(shè)計模式?
設(shè)計模式是我們開發(fā)軟件時針對常見問題的 通用 解決方案,也是前輩們在寫代碼時不斷摸索總結(jié)出來的好方法。
可以理解為打游戲的攻略,就是我們遇到同一類的對手時,怎么走位、怎么放技能之類的。
設(shè)計模式有什么用?
設(shè)計模式最直接的作用就是 減少爛代碼、讓項目代碼更好維護 。
舉個栗子,如果沒學過設(shè)計模式,可能隨著產(chǎn)品不斷加需求、改需求,你的代碼會充滿大量的 if else,新同事來了呢,也不敢動前人代碼,只能再去補充 if else,于是屎山越堆越高。
而使用設(shè)計模式后,你可以把每段邏輯單獨封裝和維護,大家協(xié)作開發(fā)也會更高效。
為什么要學設(shè)計模式?
學好設(shè)計模式,不僅能讓我們寫出更好維護、性能更高的代碼,還能開拓我們的思維,在遇到問題時能想到更多的解決方案。
因此設(shè)計模式也是軟件開發(fā)崗面試的重點,想進大廠的同學一定要學習它。
此外,很多知名項目都用到了大量的設(shè)計模式,比如 Spring、MyBatis 等。如果不學習它,可能你天天寫代碼都是 CRUD、讀別人的源碼會非常吃力。
所以建議開發(fā)崗的朋友們都要認真學習設(shè)計模式。
什么時候?qū)W?
我建議大家在學過一門編程語言、并且能夠使用開發(fā)框架去完成項目之后,再去學設(shè)計模式。如果你寫代碼的熟練度還不夠的話,直接去學設(shè)計模式會比較吃力,可能也無法理解用設(shè)計模式的好處。
那如果你學前端的話,我建議你先把界面開發(fā)、JS 語法、組件庫和 Vue / React 之類的框架運用熟練,有空了再把設(shè)計模式作為進階知識來學習就好。
要學什么?
設(shè)計模式的學習主要分為兩部分:
1. 軟件開發(fā)原則
所有的設(shè)計模式基本都是建立以下幾個軟件開發(fā)原則的基礎(chǔ)上。

比如開閉原則,就是建議我們把模塊設(shè)計的好擴展一些,每次新增功能只需要加代碼、而不用改老代碼。
2. 學習主流設(shè)計模式
主流的設(shè)計模式共有以下 23 種:
注意,不是說設(shè)計模式只有 23 種!

其中單例、工廠方法、建造者、適配器、裝飾器、代理、策略、責任鏈、觀察者、迭代器模式是重點,我自己工作中經(jīng)常用到這些、也總能在框架源碼中見到它們。這些設(shè)計模式的特色也比較鮮明、相對比較好理解。
尤其是單例模式,是重點中的重點!它有很多種不同的實現(xiàn)方式,都要了解。我用的最多的應(yīng)該是餓漢式還有雙檢鎖模式。
設(shè)計模式學習路線
建議大家按照以下 3 個階段來學習:
一、基礎(chǔ)學習
目標:從上面提到的重點開始依次了解每一種設(shè)計模式的概念、作用、應(yīng)用場景、特點、類和對象的關(guān)系,能夠?qū)υO(shè)計模式有個基礎(chǔ)的印象。
學習方式有很多種:
喜歡看視頻的同學挑個高播放量的、講師口音能接受的教程看就好了; 喜歡讀書的同學可以看《圖解設(shè)計模式》、《大話設(shè)計模式》,個人感覺這兩本書都還不錯,我自己是看前者入門的。 想快速上手的同學可以直接看菜鳥教程的文檔,每個設(shè)計模式都有講解和代碼示例,還是比較推薦的。像我有的時候忘了某個冷門的設(shè)計模式,也是靠這個文檔快速補回來。

這里建議大家在學設(shè)計模式的時候多和實際生活結(jié)合,會更好理解一些。
比如適配器模式可以理解為用一個轉(zhuǎn)接頭連接兩根線;代理模式理解為你找了個代購幫你去買東西;責任鏈模式理解為公司出了問題,員工依次甩鍋。
二、編碼實現(xiàn)
這個階段的目標是:用你熟悉的編程語言來寫代碼實現(xiàn)每個設(shè)計模式,要能夠獨立(不借助任何資料)從 0 寫出完整代碼,這樣才算是學會了。
如果剛開始大家不知道設(shè)計模式怎么應(yīng)用的話,我建議去看一些示例代碼。
可以直接在 GitHub 搜索關(guān)鍵詞 Design Pattern 或 設(shè)計模式 ,就能搜出來一大堆不同語言的代碼了。

那我建議大家把自己寫過的代碼保存好,可以打造一個自己的設(shè)計模式代碼庫,寫在簡歷上也是能加分的。
三、項目實戰(zhàn)
本階段的目標:能夠根據(jù)某個場景主動選出合適的設(shè)計模式來優(yōu)化代碼,而不是說別人告訴你這里能用設(shè)計模式,你才想起來去用。這就是架構(gòu)師和擰螺絲的區(qū)別。
這里給大家兩個學習方法吧:
1. 搜索式
花時間到網(wǎng)上搜設(shè)計模式在知名框架中的應(yīng)用,比如 Spring:

網(wǎng)上的文章很多,我就不一一列舉了。比較建議大家在面試前這么干,可以快速積累。
2. 探索式
就是在你寫代碼的過程中,一旦遇到重復(fù)代碼,就問一下自己:我能不能用上某個設(shè)計模式呢?合適的話就使用設(shè)計模式。次數(shù)多了,你就有經(jīng)驗了。
此外,我自己在寫代碼時,特別喜歡點進源碼看一看,一般是能夠通過文件命名來快速判斷出它是否使用了設(shè)計模式的,然后你就可以進一步讀源碼來學習,幫助我積累了很多知識。
但我們也要注意,設(shè)計模式雖然好用,但它不是銀彈,不要為了用而用。
比如非要把一句簡單的 if else 搞成策略模式,過分使用設(shè)計模式只會徒增系統(tǒng)的復(fù)雜度。
面試考點
面試時對設(shè)計模式的考察可能比較多元,主要有理論、實踐、源碼等考法:
理論就是問你不同設(shè)計模式的概念、優(yōu)缺點、應(yīng)用場景,設(shè)計模式之間的區(qū)別等等。
實踐就是讓你手寫某個設(shè)計模式。最??嫉木褪菃卫J?,我就被考過,當時還讓我寫出幾種不同的單例模式實現(xiàn)。
源碼就是說問你某個框架用了哪些設(shè)計模式,或者某個設(shè)計模式在哪些框架中應(yīng)用過。如果我是面試官,大概率會這么考,因為能看出候選人的知識儲備。
所以要想在設(shè)計模式這塊不吃癟,除了背八股文外,還是要保證能手寫出常考的設(shè)計模式,并且多去了解一下它在知名項目中的應(yīng)用。
以上就是本期分享。最后,歡迎加入 魚皮的編程知識星球,抱團交流學習編程,隨時向魚皮 1 對 1 提問、幫你制定學習和求職計劃不迷茫、跟著魚皮直播做項目(往期項目可無限回看)、領(lǐng)取魚皮原創(chuàng)編程學習 / 求職資料等。
掃碼體驗:

往期推薦
