更新時(shí)間:2021-04-23 10:50:16 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽1332次
設(shè)計(jì)模式的原則總結(jié)起來(lái),就是多用接口/抽象類(lèi),從而增加代碼的可擴(kuò)展性(減少修改代碼),降低模塊間的依賴(lài)和聯(lián)系,體現(xiàn)了OOP的模塊化、可擴(kuò)展性等特征。
工廠(chǎng)模式(Factory Pattern)是 Java 中最常用的設(shè)計(jì)模式之一。這種類(lèi)型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。
在Java工廠(chǎng)模式中,我們?cè)趧?chuàng)建對(duì)象時(shí)不會(huì)對(duì)客戶(hù)端暴露創(chuàng)建邏輯,并且是通過(guò)使用一個(gè)共同的接口來(lái)指向新創(chuàng)建的對(duì)象。
意圖:定義一個(gè)創(chuàng)建對(duì)象的接口,讓其子類(lèi)自己決定實(shí)例化哪一個(gè)工廠(chǎng)類(lèi),工廠(chǎng)模式使其創(chuàng)建過(guò)程延遲到子類(lèi)進(jìn)行。
主要解決:主要解決接口選擇的問(wèn)題。
何時(shí)使用:我們明確地計(jì)劃不同條件下創(chuàng)建不同實(shí)例時(shí)。
如何解決:讓其子類(lèi)實(shí)現(xiàn)工廠(chǎng)接口,返回的也是一個(gè)抽象的產(chǎn)品。
關(guān)鍵代碼:創(chuàng)建過(guò)程在其子類(lèi)執(zhí)行。
應(yīng)用實(shí)例:(1)您需要一輛汽車(chē),可以直接從工廠(chǎng)里面提貨,而不用去管這輛汽車(chē)是怎么做出來(lái)的,以及這個(gè)汽車(chē)?yán)锩娴木唧w實(shí)現(xiàn)。(2)Hibernate 換數(shù)據(jù)庫(kù)只需換方言和驅(qū)動(dòng)就可以。
優(yōu)點(diǎn):(1)一個(gè)調(diào)用者想創(chuàng)建一個(gè)對(duì)象,只要知道其名稱(chēng)就可以了。(2)擴(kuò)展性高,如果想增加一個(gè)產(chǎn)品,只要擴(kuò)展一個(gè)工廠(chǎng)類(lèi)就可以。(3)屏蔽產(chǎn)品的具體實(shí)現(xiàn),調(diào)用者只關(guān)心產(chǎn)品的接口。
缺點(diǎn):每次增加一個(gè)產(chǎn)品時(shí),都需要增加一個(gè)具體類(lèi)和對(duì)象實(shí)現(xiàn)工廠(chǎng),使得系統(tǒng)中類(lèi)的個(gè)數(shù)成倍增加,在一定程度上增加了系統(tǒng)的復(fù)雜度,同時(shí)也增加了系統(tǒng)具體類(lèi)的依賴(lài)。這并不是什么好事。
注意事項(xiàng):作為一種創(chuàng)建類(lèi)模式,在任何需要生成復(fù)雜對(duì)象的地方,都可以使用工廠(chǎng)方法模式。有一點(diǎn)需要注意的地方就是復(fù)雜對(duì)象適合使用工廠(chǎng)模式,而簡(jiǎn)單對(duì)象,特別是只需要通過(guò) new 就可以完成創(chuàng)建的對(duì)象,無(wú)需使用工廠(chǎng)模式。如果使用工廠(chǎng)模式,就需要引入一個(gè)工廠(chǎng)類(lèi),會(huì)增加系統(tǒng)的復(fù)雜度。
抽象工廠(chǎng)模式(Abstract Factory Pattern)是圍繞一個(gè)超級(jí)工廠(chǎng)創(chuàng)建其他工廠(chǎng)。該超級(jí)工廠(chǎng)又稱(chēng)為其他工廠(chǎng)的工廠(chǎng)。這種類(lèi)型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。
在抽象工廠(chǎng)模式中,接口是負(fù)責(zé)創(chuàng)建一個(gè)相關(guān)對(duì)象的工廠(chǎng),不需要顯式指定它們的類(lèi)。每個(gè)生成的工廠(chǎng)都能按照工廠(chǎng)模式提供對(duì)象。
意圖:提供一個(gè)創(chuàng)建一系列相關(guān)或相互依賴(lài)對(duì)象的接口,而無(wú)需指定它們具體的類(lèi)。
主要解決:主要解決接口選擇的問(wèn)題。
何時(shí)使用:系統(tǒng)的產(chǎn)品有多于一個(gè)的產(chǎn)品族,而系統(tǒng)只消費(fèi)其中某一族的產(chǎn)品。
如何解決:在一個(gè)產(chǎn)品族里面,定義多個(gè)產(chǎn)品。
關(guān)鍵代碼:在一個(gè)工廠(chǎng)里聚合多個(gè)同類(lèi)產(chǎn)品。
應(yīng)用實(shí)例:工作了,為了參加一些聚會(huì),肯定有兩套或多套衣服吧,比如說(shuō)有商務(wù)裝(成套,一系列具體產(chǎn)品)、時(shí)尚裝(成套,一系列具體產(chǎn)品),甚至對(duì)于一個(gè)家庭來(lái)說(shuō),可能有商務(wù)女裝、商務(wù)男裝、時(shí)尚女裝、時(shí)尚男裝,這些也都是成套的,即一系列具體產(chǎn)品。假設(shè)一種情況(現(xiàn)實(shí)中是不存在的,要不然,沒(méi)法進(jìn)入共產(chǎn)主義了,但有利于說(shuō)明抽象工廠(chǎng)模式),在您的家中,某一個(gè)衣柜(具體工廠(chǎng))只能存放某一種這樣的衣服(成套,一系列具體產(chǎn)品),每次拿這種成套的衣服時(shí)也自然要從這個(gè)衣柜中取出了。用 OO 的思想去理解,所有的衣柜(具體工廠(chǎng))都是衣柜類(lèi)的(抽象工廠(chǎng))某一個(gè),而每一件成套的衣服又包括具體的上衣(某一具體產(chǎn)品),褲子(某一具體產(chǎn)品),這些具體的上衣其實(shí)也都是上衣(抽象產(chǎn)品),具體的褲子也都是褲子(另一個(gè)抽象產(chǎn)品)。
優(yōu)點(diǎn):當(dāng)一個(gè)產(chǎn)品族中的多個(gè)對(duì)象被設(shè)計(jì)成一起工作時(shí),它能保證客戶(hù)端始終只使用同一個(gè)產(chǎn)品族中的對(duì)象。
缺點(diǎn):產(chǎn)品族擴(kuò)展非常困難,要增加一個(gè)系列的某一產(chǎn)品,既要在抽象的 Creator 里加代碼,又要在具體的里面加代碼。
使用場(chǎng)景:(1)QQ 換皮膚,一整套一起換。(2)生成不同操作系統(tǒng)的程序。
注意事項(xiàng):產(chǎn)品族難擴(kuò)展,產(chǎn)品等級(jí)易擴(kuò)展。
單例模式(Singleton Pattern)是 Java 中最簡(jiǎn)單的設(shè)計(jì)模式之一。這種類(lèi)型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。
這種Java單例模式涉及到一個(gè)單一的類(lèi),該類(lèi)負(fù)責(zé)創(chuàng)建自己的對(duì)象,同時(shí)確保只有單個(gè)對(duì)象被創(chuàng)建。這個(gè)類(lèi)提供了一種訪(fǎng)問(wèn)其唯一的對(duì)象的方式,可以直接訪(fǎng)問(wèn),不需要實(shí)例化該類(lèi)的對(duì)象。
注意:
(1)單例類(lèi)只能有一個(gè)實(shí)例。
(2)單例類(lèi)必須自己創(chuàng)建自己的唯一實(shí)例。
(3)單例類(lèi)必須給所有其他對(duì)象提供這一實(shí)例。
主要解決:一個(gè)全局使用的類(lèi)頻繁地創(chuàng)建與銷(xiāo)毀。
如何解決:判斷系統(tǒng)是否已經(jīng)有這個(gè)單例,如果有則返回,如果沒(méi)有則創(chuàng)建。
關(guān)鍵代碼:構(gòu)造函數(shù)是私有的。
單例設(shè)計(jì)模式一般有幾種實(shí)現(xiàn)形式,餓漢式,飽漢式,雙重加鎖式。
應(yīng)用:數(shù)據(jù)庫(kù)連接池。因?yàn)閿?shù)據(jù)庫(kù)連接池是一種數(shù)據(jù)庫(kù)資源,使用數(shù)據(jù)庫(kù)連接池的主要是為了節(jié)省打開(kāi)或者關(guān)閉數(shù)據(jù)庫(kù)連接所造成的效率損耗,這種效率上的損耗還是非常昂貴的,使用單例設(shè)計(jì)模式可以大大降低這種損耗。
多線(xiàn)程中線(xiàn)程池的設(shè)計(jì)一般也采用單例設(shè)計(jì)模式,這是由于線(xiàn)程池要方便對(duì)池中的線(xiàn)程進(jìn)行控制。
網(wǎng)站中訪(fǎng)問(wèn)計(jì)數(shù)器,一般也是采用單例設(shè)計(jì)模式實(shí)現(xiàn)的,否則難以同步。
Java代理模式在Java中十分常見(jiàn),主要用于業(yè)務(wù)邏輯的接口不希望被客戶(hù)端調(diào)用。有如Spring實(shí)現(xiàn)AOP而使用動(dòng)態(tài)代理
定義:給某一個(gè)對(duì)象提供一個(gè)代理,并由代理對(duì)象控制對(duì)原對(duì)象的引用。
靜態(tài)代理比較簡(jiǎn)單,是由程序員編寫(xiě)的代理類(lèi),并在程序運(yùn)行前就編譯好的,而不是由程序動(dòng)態(tài)產(chǎn)生代理類(lèi),這就是所謂的靜態(tài)。考慮這樣的場(chǎng)景,管理員在網(wǎng)站上執(zhí)行操作,在生成操作結(jié)果的同時(shí)需要記錄操作日志,這是很常見(jiàn)的。
JDK動(dòng)態(tài)代理:
1)定義一個(gè)事件管理器類(lèi)實(shí)現(xiàn)invocationHandle接口,并重寫(xiě)invoke(代理類(lèi),被代理的方法,方法的參數(shù)列表)方法。
2)實(shí)現(xiàn)被代理類(lèi)及其實(shí)現(xiàn)的接口,
3)調(diào)用Proxy.newProxyInstance(類(lèi)加載器,類(lèi)實(shí)現(xiàn)的接口,事務(wù)處理器對(duì)象);生成一個(gè)代理實(shí)例。
4)通過(guò)該代理實(shí)例調(diào)用方法。
cglib動(dòng)態(tài)代理:通過(guò)“繼承”可以繼承父類(lèi)所有的公開(kāi)方法,然后可以重寫(xiě)這些方法,在重寫(xiě)時(shí)對(duì)這些方法增強(qiáng),這就是cglib的思想。
以上就是動(dòng)力節(jié)點(diǎn)小編介紹的“Java常用設(shè)計(jì)模式有多少種”的內(nèi)容,希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€(xiàn)咨詢(xún),有專(zhuān)業(yè)老師隨時(shí)為您服務(wù)。
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
有基礎(chǔ) 直達(dá)就業(yè)
業(yè)余時(shí)間 高薪轉(zhuǎn)行
工作1~3年,加薪神器
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話(huà)與您溝通安排學(xué)習(xí)