設(shè)計模式
創(chuàng)新互聯(lián)公司專注于高陵企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),商城建設(shè)。高陵網(wǎng)站建設(shè)公司,為高陵等地區(qū)提供建站服務(wù)。全流程定制設(shè)計,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
這篇總結(jié)主要是基于我設(shè)計模式系列的文章而形成的的。主要是把重要的知識點用自己的話說了一遍,可能會有一些錯誤,還望見諒和指點。謝謝
更多詳細內(nèi)容可以到我的cdsn博客上查看: https://blog.csdn.net/a724888
最后,如果想要更好地完成這部分內(nèi)容的學(xué)習(xí),建議大家還是去看一下原文。
創(chuàng)建型模式
創(chuàng)建型模式 創(chuàng)建型模式的作用就是創(chuàng)建對象,說到創(chuàng)建一個對象,最熟悉的就是 new 一個對象,然后 set 相關(guān)屬性。但是,在很多場景下,我們需要給客戶端提供更加友好的創(chuàng)建對象的方式,尤其是那種我們定義了類,但是需要提供給其他開發(fā)者用的時候。
單例
單例模式保證全局的單例類只有一個實例,這樣的話使用的時候直接獲取即可,比如數(shù)據(jù)庫的一個連接,Spring里的bean,都可以是單例的。
單例模式一般有5種寫法。
第一種是餓漢模式,先把單例進行實例化,獲取的時候通過靜態(tài)方法直接獲取即可。缺點是類加載后就完成了類的實例化,浪費部分空間。
第二種是飽漢模式,先把單例置為null,然后通過靜態(tài)方法獲取單例時再進行實例化,但是可能有多線程同時進行實例化,會出現(xiàn)并發(fā)問題。
第三種是逐步改進的方法,一開始可以用synchronized關(guān)鍵字進行同步,但是開銷太大,而后改成使用volatile修飾單例,然后通過一次檢查判斷單例是否已初始化,如果未初始化就使用synchronized代碼塊,再次檢查單例防止在這期間被初始化,而后才真正進行初始化。
第四種是使用靜態(tài)內(nèi)部類來實現(xiàn),靜態(tài)內(nèi)部類只在被使用的時候才進行初始化,所以在內(nèi)部類中進行單例的實例化,只有用到的時候才會運行實例化代碼。然后外部類再通過靜態(tài)方法返回靜態(tài)內(nèi)部類的單例即可。
第五種是枚舉類,枚舉類的底層實現(xiàn)其實也是內(nèi)部類。枚舉類確保每個類對象在全局是唯一的。所以保證它是單例,這個方法是最簡單的。
工廠模式
簡單工廠一般是用一個工廠創(chuàng)建多個類的實例。
工廠模式一般是指一個工廠服務(wù)一個接口,為這個接口的實現(xiàn)類進行實例化
抽象工廠模式是指一個工廠服務(wù)于一個產(chǎn)品族,一個產(chǎn)品族可能包含多個接口,接口又會包含多個實現(xiàn)類,通過一個工廠就可以把這些綁定在一起,非常方便。
原型模式
一般通過一個實例進行克隆從而獲得更多同一原型的實例。使用實例的clone方法即可完成。
建造者模式
建造者模式中有一個概念叫做鏈?zhǔn)秸{(diào)用,鏈?zhǔn)秸{(diào)用為一個類的實例化提供便利,一般提供系列的方法進行實例化,實際上就是將set方法改造一下,將原本返回為空的set方法改為返回this實例,從而實現(xiàn)鏈?zhǔn)秸{(diào)用。
建造者模式在此基礎(chǔ)上加入了builder方法,提供給外部進行調(diào)用,同樣使用鏈?zhǔn)秸{(diào)用來完成參數(shù)注入。
結(jié)構(gòu)型模式
結(jié)構(gòu)型模式
前面創(chuàng)建型模式介紹了創(chuàng)建對象的一些設(shè)計模式。
這節(jié)介紹的結(jié)構(gòu)型模式旨在通過改變代碼結(jié)構(gòu)來達到解耦的目的,使得我們的代碼容易維護和擴展。
橋接模式
有點復(fù)雜。建議參考原文
適配器模式
適配器模式用于將兩個不同的類進行適配。
適配器模式和代理模式的異同
比較這兩種模式,其實是比較對象適配器模式和代理模式,在代碼結(jié)構(gòu)上,
它們很相似,都需要一個具體的實現(xiàn)類的實例。
但是它們的目的不一樣,代理模式做的是增強原方法的活;
適配器做的是適配的活,為的是提供“把雞包裝成鴨,然后當(dāng)做鴨來使用”,
而雞和鴨它們之間原本沒有繼承關(guān)系。
適配器模式可以分為類適配器,對象適配器等。
類適配器通過繼承父類就可以把自己適配成父類了。
而對象適配器則需要把對象傳入另一個對象的構(gòu)造方法中,以便進行包裝。
享元模式
享元模式的核心在于享元工廠類,
享元工廠類的作用在于提供一個用于存儲享元對象的享元池,
用戶需要對象時,首先從享元池中獲取,
如果享元池中不存在,則創(chuàng)建一個新的享元對象返回給用戶,
在享元池中保存該新增對象。
代理模式
我們發(fā)現(xiàn)沒有,代理模式說白了就是做 “方法包裝” 或做 “方法增強”。
在面向切面編程中,算了還是不要吹捧這個名詞了,在 AOP 中,
其實就是動態(tài)代理的過程。比如 Spring 中,
我們自己不定義代理類,但是 Spring 會幫我們動態(tài)來定義代理,
然后把我們定義在 @Before、@After、@Around 中的代碼邏輯動態(tài)添加到代理中。
外觀模式
外觀模式一般封裝具體的實現(xiàn)細節(jié),為用戶提供一個更加簡單的接口。
通過一個方法調(diào)用就可以獲取需要的內(nèi)容。
組合模式
組合模式用于表示具有層次結(jié)構(gòu)的數(shù)據(jù),使得我們對單個對象和組合對象的訪問具有一致性。
直接看一個例子吧,每個員工都有姓名、部門、薪水這些屬性,
同時還有下屬員工集合(雖然可能集合為空),
而下屬員工和自己的結(jié)構(gòu)是一樣的,
也有姓名、部門這些屬性,
同時也有他們的下屬員工集合。
class Employee {
private String name;
private String dept;
private int salary;
private List<Employee> subordinates; // 下屬
}
裝飾者模式
裝飾者
裝飾者模式把每個增強類都繼承最高級父類。然后需要功能增強時把類實例傳入增強類即可,然后增強類在使用時就可以增強原有類的功能了。
和代理模式不同的是,裝飾者模式每個裝飾類都繼承父類,并且可以進行多級封裝。
行為型模式
行為型模式
行為型模×××之間的相互作用,將職責(zé)劃分清楚,使得我們的代碼更加地清晰。
策略模式
策略模式一般把一個策略作為一個類,并且在需要指定策略的時候傳入實例,于是我們可以在需要使用算法的地方傳入指定算法。
命令模式
命令模式一般分為命令發(fā)起者,命令以及命令接受者三個角色。
命令發(fā)起者在使用時需要注入命令實例。然后執(zhí)行命令調(diào)用。
命令調(diào)用實際上會調(diào)用命令接收者的方法進行實際調(diào)用。
比如遙控器按鈕相當(dāng)于一條命令,點擊按鈕時命令運行,自動調(diào)用電視機提供的方法即可。
模板方法模式
模板方法一般指提供了一個方法模板,并且其中有部分實現(xiàn)類和部分抽象類,并且規(guī)定了執(zhí)行順序。
實現(xiàn)類是模板提供好的方法。而抽象類則需要用戶自行實現(xiàn)。
模板方法規(guī)定了一個模板中方法的執(zhí)行順序,非常適合一些開發(fā)框架,于是模板方法也廣泛運用在開源框架中。
觀察者模式和事件監(jiān)聽機制
觀察者模式一般用于訂閱者和消息發(fā)布者之間的數(shù)據(jù)訂閱。
一般分為觀察者和主題,觀察者訂閱主題,把實例注冊到主題維護的觀察者列表上。
而主題更新數(shù)據(jù)時自動把數(shù)據(jù)推給觀察者或者通知觀察者數(shù)據(jù)已經(jīng)更新。
但是由于這樣的方式消息推送耦合關(guān)系比較緊。并且很難在不打開數(shù)據(jù)的情況下知道數(shù)據(jù)類型是什么。
知道后來為了使數(shù)據(jù)格式更加靈活,使用了事件和事件監(jiān)聽器的模式,事件包裝的事件類型和事件數(shù)據(jù),從主題和觀察者中解耦。
主題當(dāng)事件發(fā)生時,觸發(fā)該事件的所有監(jiān)聽器,把該事件通過監(jiān)聽器列表發(fā)給每個監(jiān)聽器,監(jiān)聽得到事件以后,首先根據(jù)自己支持處理的事件類型中找到對應(yīng)的事件處理器,再用處理器處理對應(yīng)事件。
責(zé)任鏈模式
責(zé)任鏈通常需要先建立一個單向鏈表,然后調(diào)用方只需要調(diào)用頭部節(jié)點就可以了,后面會自動流轉(zhuǎn)下去。
比如流程審批就是一個很好的例子,只要終端用戶提交申請,根據(jù)申請的內(nèi)容信息,自動建立一條責(zé)任鏈,然后就可以開始流轉(zhuǎn)了。
×××黃小斜是跨考軟件工程的 985 碩士,自學(xué) Java 兩年,拿到了 BAT 等近十家大廠 offer,從技術(shù)小白成長為阿里工程師。作者專注于 JAVA 后端技術(shù)棧,熱衷于分享程序員干貨、學(xué)習(xí)經(jīng)驗、求職心得和程序人生,目前黃小斜的CSDN博客有百萬+訪問量,知乎粉絲2W+,全網(wǎng)已有10W+讀者。
黃小斜是一個斜杠青年,堅持學(xué)習(xí)和寫作,相信終身學(xué)習(xí)的力量,希望和更多的程序員交朋友,一起進步和成長!
原創(chuàng)電子書×××回復(fù)【原創(chuàng)電子書】即可領(lǐng)取我原創(chuàng)的電子書《菜鳥程序員修煉手冊:從技術(shù)小白到阿里巴巴Java工程師》
程序員3T技術(shù)學(xué)習(xí)資源: 一些程序員學(xué)習(xí)技術(shù)的資源大禮×××關(guān)鍵字 “資料” 即可免費無套路獲取。
考研復(fù)習(xí)資料: 計算機考研大禮包,都是我自己考研復(fù)習(xí)時用的一些復(fù)習(xí)資料,包括公共課和專業(yè)的復(fù)習(xí)視頻,這里也推薦給大×××關(guān)鍵字 “考研” 即可免費獲取。
×××術(shù)江湖
如果大家想要實×××章以及分享的干貨的話,可×××術(shù)江湖】一位阿里 Java 工程師的技術(shù)小站,作者黃小斜,專注 Java 相關(guān)技術(shù):SSM、SpringBoot、MySQL、分布式、中間件、集群、Linux、網(wǎng)絡(luò)、多線程,偶爾講點Docker、ELK,同時也分享技術(shù)干貨和學(xué)習(xí)經(jīng)驗,致力于Java全棧開發(fā)!
Java工程師必備學(xué)習(xí)資源: 一些Java工程師常用學(xué)習(xí)資×××關(guān)鍵字 “Java” 即可免費無套路獲取?!痢痢?/p>
網(wǎng)站標(biāo)題:設(shè)計模式常見面試知識點總結(jié)
分享網(wǎng)址:http://jinyejixie.com/article38/pggssp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、移動網(wǎng)站建設(shè)、網(wǎng)站導(dǎo)航、ChatGPT、做網(wǎng)站、網(wǎng)站設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)