過關(guān)斬將之路-設(shè)計模式
hello大家,因之前有位學員在面試過程中被問到了“熟悉哪些設(shè)計模式”,她回答的不多,所以今天將跟大家介紹一些設(shè)計模式。
1、什么是單例模式?
單例模式是一種常用的軟件設(shè)計模式,在應(yīng)用這個模式時,單例對象的類必須保證只有一個實例存在,整個系統(tǒng)只能使用一個對象實例。
優(yōu)點:不會頻繁地創(chuàng)建和銷毀對象,浪費系統(tǒng)資源。
可能這會需要你手寫一個單例模式,這就得自己去學了,因為單例模式有很多種寫法,懶漢模式,餓漢模式,雙重檢查模式等。懶漢模式就是用的時候再去創(chuàng)建對象,餓漢模式就是提前就已經(jīng)加載好的靜態(tài)static對象,雙重檢查模式就是兩次檢查避免多線程造成創(chuàng)建了多個對象。
單例模式有很多種的寫法,我總結(jié)一下:
餓漢式單例模式的寫法:線程安全
懶漢式單例模式的寫法:非線程安全
雙檢鎖單例模式的寫法:線程安全
2、什么是代理模式
代理模式是給某一個對象提供一個代理,并由代理對象控制對原對象的引用。
優(yōu)點:
代理模式能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,在一定程度上降低了系統(tǒng)的耦合度;
可以靈活地隱藏被代理對象的部分功能和服務(wù),也增加額外的功能和服務(wù)。
缺點:
由于使用了代理模式,因此程序的性能沒有直接調(diào)用性能高;
使用代理模式提高了代碼的復(fù)雜度。

3、什么是簡單工廠模式?
簡單工廠模式又叫靜態(tài)工廠方法模式,就是建立一個工廠類,對實現(xiàn)了同一接口的一些類進行實例的創(chuàng)建。

優(yōu)點:
工廠類含有必要的判斷邏輯,可以決定在什么時候創(chuàng)建哪一個產(chǎn)品類的實例,客戶端可以免除直接創(chuàng)建產(chǎn)品對象的責任,而僅僅“消費”產(chǎn)品;簡單工廠模式通過這種做法實現(xiàn)了對責任的分割,它提供了專門的工廠類用于創(chuàng)建對象;
客戶端無須知道所創(chuàng)建的具體產(chǎn)品類的類名,只需要知道具體產(chǎn)品類所對應(yīng)的參數(shù)即可,對于一些復(fù)雜的類名,通過簡單工廠模式可以減少使用者的記憶量;
通過引入配置文件,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產(chǎn)品類,在一定程度上提高了系統(tǒng)的靈活性。
缺點:
不易拓展,一旦添加新的產(chǎn)品類型,就不得不修改工廠的創(chuàng)建邏輯;
產(chǎn)品類型較多時,工廠的創(chuàng)建邏輯可能過于復(fù)雜,一旦出錯可能造成所有產(chǎn)品的創(chuàng)建失敗,不利于系統(tǒng)的維護。
4、什么是抽象工廠模式?
抽象工廠模式是在簡單工廠的基礎(chǔ)上將未來可能需要修改的代碼抽象出來,通過繼承的方式讓子類去做決定。

5、什么是裝飾器模式?
裝飾器模式是指動態(tài)地給一個對象增加一些額外的功能,同時又不改變其結(jié)構(gòu)。
優(yōu)點:裝飾類和被裝飾類可以獨立發(fā)展,不會相互耦合,裝飾模式是繼承的一個替代模式,裝飾模式可以動態(tài)擴展一個實現(xiàn)類的功能。
裝飾器模式的關(guān)鍵:裝飾器中使用了被裝飾的對象
比如,創(chuàng)建一個對象“gebilaowang”,給對象添加不同的裝飾,穿上夾克、戴上帽子......,這個執(zhí)行過程就是裝飾者模式。
一句名言:人靠衣裳馬靠鞍。都是裝飾器模式的生活案列
6、代理模式和裝飾器模式有何不同?
它們都是結(jié)構(gòu)型模式,但側(cè)重點不同:代理模式重在訪問權(quán)限的控制,而裝飾器模式重在功能的加強。
7、知道模板方法模式嘛?
模板方法模式是指定義一個算法骨架,將具體內(nèi)容延遲到子類去實現(xiàn)。
優(yōu)點:
提高代碼復(fù)用性:將相同部分的代碼放在抽象的父類中,而將不同的代碼放入不同的子類中;
實現(xiàn)了反向控制:通過一個父類調(diào)用其子類的操作,通過對子類的具體實現(xiàn)擴展不同的行為,實現(xiàn)了反向控制并且符合開閉原則。
打個比方:喝茶:燒水----放入茶葉---喝茶。放入的茶葉每個人自己的喜好不一樣,有的是普洱、有的是鐵觀音等。
8、知道享元模式嗎?
顧名思義就是被共享的單元。享元模式的意圖是復(fù)用對象,節(jié)省內(nèi)存,前提是享元對象是不可變對象。
具體來講,當一個系統(tǒng)中存在大量重復(fù)對象的時候,如果這些重復(fù)的對象是不可變對象,我們就可以利用享元模式將對象設(shè)計成享元,在內(nèi)存中只保留一份實例,供多處代碼引用。這樣可以減少內(nèi)存中對象的數(shù)量,起到節(jié)省內(nèi)存的目的。
9、享元模式和單列模式的區(qū)別在哪?
單例模式是創(chuàng)建型模式,重在只能有一個對象。而享元模式是結(jié)構(gòu)型模式,重在節(jié)約內(nèi)存使用,提升程序性能。
享元模式:把一個或者多個對象存起來,用的時候,直接從緩存里獲取。也就是說享元模式不一定只有一個對象。
10、什么是策略模式?
策略模式是指定義一系列算法,將每個算法都封裝起來,并且使他們之間可以相互替換。
優(yōu)點:遵循了開閉原則,擴展性良好。
缺點:隨著策略的增加,對外暴露越來越多。
我們?nèi)ダ_的交通方式(策略)很多,比如說坐飛機、坐高鐵、自己開車等方式。每一種方式就可以理解為每一種策略。
這就是生活中的策略模式。
11、了解適配器模式嘛?
適配器模式是將一個類的接口變成客戶端所期望的另一種接口,從而使原本因接口不匹配而無法一起工作的兩個類能夠在一起工作。
優(yōu)點:
可以讓兩個沒有關(guān)聯(lián)的類一起運行,起著中間轉(zhuǎn)換的作用;
靈活性好,不會破壞原有的系統(tǒng)。
缺點:過多地使用適配器,容易使代碼結(jié)構(gòu)混亂,如明明看到調(diào)用的是 A 接口,內(nèi)部調(diào)用的卻是 B接口的實現(xiàn)。
生活中的插座,為了適應(yīng)各種插頭,然后上面有兩個孔的,三個空的,基本都能適應(yīng)。還有萬能充電器、USB接口等。這些都是生活中的適配器模式
12、了解觀察者模式嘛?
觀察者模式是定義對象間的一種一對多依賴關(guān)系,使得每當一個對象狀態(tài)發(fā)生改變時,其相關(guān)依賴對象皆得到通知并被自動更新。觀察者模式又叫做發(fā)布-訂閱(Publish/Subscribe)模式、模型-視圖(Model/View)模式、源-監(jiān)聽器(Source/Listener)模式或從屬者(Dependents)模式。
優(yōu)點:
觀察者模式可以實現(xiàn)表示層和數(shù)據(jù)邏輯層的分離,并定義了穩(wěn)定的消息更新傳遞機制,抽象了
更新接口,使得可以有各種各樣不同的表示層作為具體觀察者角色;
觀察者模式在觀察目標和觀察者之間建立一個抽象的耦合;
觀察者模式支持廣播通信;
觀察者模式符合開閉原則(對拓展開放,對修改關(guān)閉)的要求。
缺點:
如果一個觀察目標對象有很多直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間;
如果在觀察者和觀察目標之間有循環(huán)依賴的話,觀察目標會觸發(fā)它們之間進行循環(huán)調(diào)用,可能導(dǎo)致系統(tǒng)崩潰;
觀察者模式?jīng)]有相應(yīng)的機制讓觀察者知道所觀察的目標對象是怎么發(fā)生變化的,而僅僅只是知道觀察目標發(fā)生了變化。

以上這些設(shè)計模式能應(yīng)對絕大多數(shù)人和面試場景。建議私下自己用代碼實現(xiàn)一番,便于更好地理解。