摘要:這個(gè)模式感覺一一般和工廠模式一起使用的比較多比較方便結(jié)構(gòu)型模式這些設(shè)計(jì)模式關(guān)注類和對(duì)象的組合。設(shè)計(jì)模式這些設(shè)計(jì)模式特別關(guān)注表示層。
設(shè)計(jì)模式的的六大原則:
學(xué)習(xí)設(shè)計(jì)模式之前最好先了解一下設(shè)計(jì)模式的設(shè)計(jì)原則:
1. 開閉原則(open close principle)
開放即指對(duì)擴(kuò)展開放,對(duì)修改關(guān)閉 簡(jiǎn)而言之,就是擴(kuò)展功能的時(shí)候應(yīng)該盡量的不修改原有的代碼。
2. 里氏代換原則(liskov substitution principle)
可以簡(jiǎn)單理解為派生類與基類的替換關(guān)系,一旦程序中出現(xiàn)基類,那么這個(gè)基類若是唄派生類替換了,也應(yīng)該是合適的,并且對(duì)程序功能不受影響,該原則實(shí)際上是開閉原則的補(bǔ)充。 基類能真正復(fù)用,派生類也能夠在基類的基礎(chǔ)上增加新的行為。實(shí)現(xiàn)開閉原則的關(guān)鍵步驟就是抽象化,而基類與子類的繼承關(guān)系就是抽象化的具體實(shí)現(xiàn),所以里氏代換原則是對(duì)實(shí)現(xiàn)抽象化的具體步驟的規(guī)范。
3. 依賴倒轉(zhuǎn)原則(dependence inverse principle)
這個(gè)原則是開閉原則的基礎(chǔ),具體內(nèi)容:針對(duì)接口編程,依賴于抽象而不依賴于具體。
4. 接口隔離原則(Interface Segregation Principle)
使用多個(gè)隔離的接口,比使用單個(gè)接口要好,該模式出發(fā)點(diǎn)在與大一點(diǎn)的軟件設(shè)計(jì)架構(gòu),便于維護(hù)升級(jí),降低耦合度。
5.迪米特法則,又稱最少知道原則(Demeter Principle)
一個(gè)實(shí)體應(yīng)當(dāng)盡量少地與其他實(shí)體之間發(fā)生相互作用,使得系統(tǒng)功能模塊相對(duì)獨(dú)立。
6. 合成復(fù)用原則(Composite Reuse Principle)
盡量使用合成/聚合的方式,而不是使用繼承。
創(chuàng)建型模式(creational pattern)
隱藏創(chuàng)建對(duì)象的創(chuàng)建邏輯,提供創(chuàng)建對(duì)象的接口,而非使用new關(guān)鍵字進(jìn)行創(chuàng)建。
工廠模式(factory pattern)
隱藏創(chuàng)建的對(duì)象的邏輯,通過共同對(duì)的接口創(chuàng)建對(duì)象。
實(shí)現(xiàn)demo結(jié)構(gòu)如下圖,實(shí)現(xiàn)demo代碼點(diǎn)這里這是我學(xué)習(xí)的時(shí)候?qū)懙膁emo
抽象工廠模式(abstract factory pattern)
這個(gè)模式是工廠的共工廠 叫超級(jí)工廠模式還比較貼切,在抽象工廠模式中,接口是負(fù)責(zé)創(chuàng)建一個(gè)相關(guān)對(duì)象的工廠,不需要顯式指定它們的類。每個(gè)生成的工廠都能按照工廠模式提供對(duì)象。
單例模式(singleton pattern)
一個(gè)類負(fù)責(zé)創(chuàng)建自己的對(duì)象,同時(shí)確保只有單個(gè)對(duì)象被創(chuàng)建。這個(gè)類提供了一種訪問其唯一的對(duì)象的方式,可以直接訪問,不需要實(shí)例化該類的對(duì)象
不支持線程的懶漢單例模式
public class Singleton_unsupport_multithread { private Singleton_unsupport_multithread() { // TODO Auto-generated constructor stub **} private static Singleton_unsupport_multithread instance; public static Singleton_unsupport_multithread getSingleton() { if (instance == null) { instance = new Singleton_unsupport_multithread(); } return instance; } public void println() { System.out.println("In unsupport_multithread"); } }
支持多線程的懶漢單例模式
public class Singleton_support_multithread { private Singleton_support_multithread() { // TODO Auto-generated constructor stub } private static volatile Singleton_support_multithread instance; /** * 第一個(gè)判斷可以減少鎖住對(duì)象的情況 如果不為空直接返回 效率更高 * 第二個(gè)判斷就是懶加載的判斷 * * @return */ public static Singleton_support_multithread getInstance() { if (instance == null) { synchronized (Singleton_support_multithread.class) { if (instance == null) instance = new Singleton_support_multithread(); } } return instance; } }
餓漢單例模式
/** * * @author Vincent * 線程安全 但是容易產(chǎn)生垃圾對(duì)象,沒有加鎖執(zhí)行效率會(huì)比較高 * 但不是懶加載 類一加載的時(shí)候就進(jìn)行初始化 浪費(fèi)內(nèi)存 * */ public class Singleton_hungry_man { private Singleton_hungry_man() { // TODO Auto-generated constructor stub } private static Singleton_hungry_man instance = new Singleton_hungry_man(); public static Singleton_hungry_man getInstance() { return instance; } }
登記注冊(cè)單例模式
/** * * @author Vincent * 登記注冊(cè)式 單例 * 這里其實(shí)與前面的餓漢單例模式有點(diǎn)類似 但是由于利用了ClassLoaderDe特性 * 使在不調(diào)用的getInstance的時(shí)候不會(huì)初始化instance 實(shí)現(xiàn)了懶加載 * */ public class Singleton_register { private static class SingletonHolder { private static Singleton_register instance = new Singleton_register(); } private Singleton_register() { // TODO Auto-generated constructor stub } public static final Singleton_register getInstance() { return SingletonHolder.instance; } }
枚舉單例模式
/** * * @author Vincent * 講道理哦 這個(gè)方式最方便的單例模式 * 利用枚舉 自帶支持 序列化機(jī)制 防止反序列化多次創(chuàng)建對(duì)象 可以適應(yīng)多線程 然而卻不怎么受待見 大多數(shù)人不用這個(gè)方式 可能和習(xí)慣有關(guān)系吧 = = * */ public enum Singleton_enum { Instance; }
建造者模式(builder pattern)
使用多個(gè)簡(jiǎn)單的對(duì)象一步一步構(gòu)建成一個(gè)復(fù)雜的對(duì)象。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。值得一說的是感覺是這個(gè)設(shè)計(jì)模式 感覺更加注重內(nèi)部對(duì)象的細(xì)節(jié),內(nèi)部零件裝配的順序。
原型模式(prototype pattern)
用于創(chuàng)建重復(fù)的對(duì)象,同時(shí)又能保證性能
這種模式是實(shí)現(xiàn)了一個(gè)原型接口,該接口用于創(chuàng)建當(dāng)前對(duì)象的克隆。當(dāng)直接創(chuàng)建對(duì)象的代價(jià)比較大時(shí),則采用這種模式。
這個(gè)模式感覺一一般和工廠模式一起使用的比較多 比較方便
結(jié)構(gòu)型模式(ctructural pattern)
這些設(shè)計(jì)模式關(guān)注類和對(duì)象的組合。繼承的概念被用來組合接口和定義組合對(duì)象獲得新功能的方式。
適配器模式(adapter pattern)
將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口。適配器模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作。
橋接模式(bridge pattern)
是用于把抽象化與實(shí)現(xiàn)化解耦,使得二者可以獨(dú)立變化,目的就是為了抽象與實(shí)現(xiàn)分離,都可以有獨(dú)立的變化,用抽象類依賴實(shí)現(xiàn)類來實(shí)現(xiàn)。
這里簡(jiǎn)單說一下橋接模式與適配器模式的區(qū)別:從名字來理解比較容易理解,適配器嘛 那就是已經(jīng)有了一些功能類,但是需要一個(gè)新的功能,這個(gè)時(shí)候沒必要寫重復(fù)的或者說現(xiàn)在有可重用的功能,就需要適配器了,打個(gè)比方,你現(xiàn)在有一個(gè)type-c接口的手機(jī),還有一個(gè)圓孔耳機(jī),手機(jī)是可以沒必要再“鉆”一個(gè)圓孔耳機(jī)孔,而耳機(jī)也不能錘扁為type-c,這個(gè)時(shí)候type-c轉(zhuǎn)接頭就來了,這就是一個(gè)適配器;但是橋接模式中,有一個(gè)根本的區(qū)別就是橋接模式一開始設(shè)計(jì)就是這樣的架構(gòu),是為了可擴(kuò)展,而不是設(shè)配器模式是為了解決問題而誕生的,這是一種設(shè)計(jì)最初就存在的模式,橋接模式一般是一個(gè)抽象實(shí)體類,然后內(nèi)部擁有功能接口的引用,這種結(jié)構(gòu)很方便功能實(shí)現(xiàn)類的擴(kuò)展,還有實(shí)體類的擴(kuò)展。
過濾器模式(filter pattern)/標(biāo)準(zhǔn)模式(criteria pattern)
這個(gè)模式允許開發(fā)人員使用不同的標(biāo)準(zhǔn)過濾一組對(duì)象,通過該邏輯運(yùn)算易解耦合的方式把他們連接起來,通過結(jié)合多個(gè)標(biāo)準(zhǔn)來獲得一個(gè)標(biāo)準(zhǔn)。
組合模式(composite pattern)
把一組相似的對(duì)象當(dāng)作一個(gè)單一的對(duì)象。組合模式依據(jù)樹形結(jié)構(gòu)來組合對(duì)象,用來表示部分以及整體層次,創(chuàng)建了對(duì)象組的樹形結(jié)構(gòu),創(chuàng)建了一個(gè)包含自己對(duì)象組的類,該類提供修改對(duì)象組的方式。
裝飾器模式(decorator pattern)
允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)。這種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類的一個(gè)包裝。
這種模式創(chuàng)建了一個(gè)裝飾類,用來包裝原有的類,并在保持類方法簽名完整性的前提下,提供了額外的功能。
外觀模式(facade pattern)
該模式會(huì)隱藏系統(tǒng)復(fù)雜性,向現(xiàn)有的系統(tǒng)添加了一個(gè)接口。比如 電腦來講,開啟電腦的是會(huì)同時(shí)開啟CPU,硬盤,內(nèi)存,但是我們只管開啟電腦而不需要知道其中內(nèi)部的實(shí)現(xiàn)。
享元模式(flyweght pattern)
為了減少創(chuàng)建對(duì)象的數(shù)量來減少內(nèi)存的占用提高性能,是對(duì)現(xiàn)有的對(duì)象嘗試重用,如果沒找到匹配的對(duì)象,則創(chuàng)建新的對(duì)象。比如:在String類中,會(huì)把創(chuàng)建多的字符串放在字符串緩存池里邊。
注意:
1.要區(qū)別出對(duì)象的內(nèi)部狀態(tài)與外部狀態(tài),否則容易有引起一些線程問題 1.一般與工廠模式混合使用,便于對(duì)象的管理
代理模式(proxy pattern)
在代理模式中,我們創(chuàng)建具有現(xiàn)有對(duì)象的對(duì)象,以便向外界提供功能接口,為其他對(duì)象提供一個(gè)代理以控制對(duì)這個(gè)對(duì)象的訪問。主要是為了隱藏被代理類的內(nèi)部實(shí)現(xiàn)。
行為型模式(behavioral pattern)
這些設(shè)計(jì)模式特別關(guān)注對(duì)象之間的通信
責(zé)任鏈模式(chain of responsibility pattern)
請(qǐng)求創(chuàng)建了一個(gè)接收者對(duì)象的鏈。這種模式給予請(qǐng)求的類型,對(duì)請(qǐng)求的發(fā)送者和接收者進(jìn)行解耦在這種模式中,通常每個(gè)接收者都包含對(duì)另一個(gè)接收者的引用。如果一個(gè)對(duì)象不能處理該請(qǐng)求,那么它會(huì)把相同的請(qǐng)求傳給下一個(gè)接收者,依此類推。
命令行模式(command pattern)
一種數(shù)據(jù)驅(qū)動(dòng)的設(shè)計(jì)模式,請(qǐng)求以命令的形式包裹在對(duì)象中,并傳給調(diào)用對(duì)象。調(diào)用對(duì)象尋找可以處理該命令的合適的對(duì)象,并把該命令傳給相應(yīng)的對(duì)象,該對(duì)象執(zhí)行命令
解釋模式(interpreter pattern)
提供了余元的語(yǔ)法或表達(dá)式的方式,屬于行為模式,這種模式實(shí)現(xiàn)了一個(gè)表達(dá)式接口,該接口解釋一個(gè)特定的上下文,一般用于SQL解析,符號(hào)處理解析引擎之類。這個(gè)模式一般比較少見。
迭代器模式(iterator pattern)
這個(gè)模式用于順序訪問集合對(duì)象的元素,而不需要知道底層對(duì)象的表示。
中介者模式(mediator pattern)
用于降低多個(gè)對(duì)象和類之間的通信復(fù)雜性。提供了中介類,這個(gè)中介類負(fù)責(zé)處理不同類之間的通信,使系統(tǒng)降耦合。
適用場(chǎng)景:系統(tǒng)對(duì)象之間存在比較復(fù)雜的引用關(guān)系,導(dǎo)致他們之間的依賴關(guān)系結(jié)構(gòu)混亂難以復(fù)用;或者想通過一個(gè)中間類封裝多個(gè)類中的行為,而又不想生成太多的子類。
觀察者模式(observer pattern)
當(dāng)對(duì)象存在一對(duì)多的關(guān)系時(shí)候,比如:一個(gè)對(duì)象被修改的時(shí)候,就會(huì)通知他它的依賴對(duì)象。
實(shí)現(xiàn)方式:在抽象類里使用觀察者列表。
注意事項(xiàng): 使用的時(shí)候不要循環(huán)引用
狀態(tài)模式(state pattern )
類的行為是根據(jù)其狀態(tài)而定的,在狀態(tài)模式中,通常創(chuàng)建的表示狀態(tài)的對(duì)象和一個(gè)行為隨著狀態(tài)對(duì)象改變而改變的context對(duì)象。
允許對(duì)象在內(nèi)部狀態(tài)發(fā)生改變的時(shí)候改變它的行為。
空對(duì)象模式(null object pattern)
一個(gè)可能空對(duì)象取代null對(duì)象的例的檢查,null對(duì)象不是檢查空值,而是反應(yīng)一個(gè)不做任何動(dòng)作的關(guān)系,這樣的null對(duì)象也可以在數(shù)據(jù)不可用的時(shí)候提供默認(rèn)的行為。
空對(duì)象模式中,通常創(chuàng)建一個(gè)指定各種要執(zhí)行的操作的抽象類和擴(kuò)展該類的實(shí)體類,然后創(chuàng)建未對(duì)該類做任何實(shí)現(xiàn)的空對(duì)象類,該類可以無(wú)縫的使用在需要檢查空值的地方。
J2EE設(shè)計(jì)模式(behavioral pattern)
這些設(shè)計(jì)模式特別關(guān)注表示層。這些模式是由 Sun Java Center 鑒定的。
待續(xù)。。。文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76730.html
摘要:當(dāng)然,除了讓我們顯得更加專業(yè)之外,在自己所學(xué)習(xí)或者工作的項(xiàng)目中,適當(dāng)合理的使用設(shè)計(jì)模式,能夠給項(xiàng)目帶來很大的好處。 簡(jiǎn)單說兩句 本文首發(fā)公眾號(hào)【一名打字員】 對(duì)不住各位老鐵了,年前說好要更幾波JAVA的東西,又偷懶了,沒辦法,在這里用小錘錘偷偷錘了自己幾下。由于工作原因,更新時(shí)間不定,各位老鐵有問題可以私聊我哈。 對(duì)于初學(xué)者或者是正在向中高級(jí)的Java程序猿(打字員)來說,時(shí)刻梳理自己...
摘要:發(fā)布史年月日,公司正式發(fā)布語(yǔ)言,這一天是的生日。年月日,發(fā)布,成為語(yǔ)言發(fā)展史上的又一里程碑。年月,發(fā)布,三個(gè)版本分別改為,,,。年月日,以億美元收購(gòu)公司,并取得了的版權(quán)。年月日,發(fā)布,并改用的命名方式。 特此聲明:本文為本人公司郭總原創(chuàng)書籍的前言,該書還未出版,作為該書籍的初版在接下來的時(shí)間里,將免費(fèi)在本人微信公眾號(hào)內(nèi)不間斷更新與大家一起學(xué)習(xí)閱讀。喜歡學(xué)習(xí)的小伙伴可以搜索微信公眾號(hào):程...
摘要:流行的編程語(yǔ)言是一項(xiàng)用于開發(fā)應(yīng)用程序的技術(shù),可以讓變得更有意思和更實(shí)用。年月,由于甲骨文對(duì)于社區(qū)的不友善,因此揚(yáng)言將退出。在運(yùn)行時(shí),平臺(tái)中的解釋器對(duì)這些字節(jié)碼進(jìn)行解釋執(zhí)行,執(zhí)行過程中需要的類在聯(lián)接階段被載入到運(yùn)行環(huán)境中。 流行的編程語(yǔ)言Java Java 是一項(xiàng)用于開發(fā)應(yīng)用程序的技術(shù),可以讓 Web 變得更有意思和更實(shí)用。 Java 與 javascript 并不相同,后者是一種用于創(chuàng)...
摘要:年期間微軟公司發(fā)布,無(wú)論是技術(shù)實(shí)現(xiàn)上還是目標(biāo)用戶都與有很多相近之處,給帶來了很多討論比較和競(jìng)爭(zhēng)對(duì)的發(fā)展進(jìn)程影響很大。年月日大會(huì)上,公司宣布最終會(huì)將開源。及其他與公司爭(zhēng)奪的控制權(quán),令從跨平臺(tái)技術(shù)變?yōu)榻壎ㄔ谏系募夹g(shù)是微軟公司的主要目的。 一、基礎(chǔ) 面向?qū)ο?面向?qū)ο蟾拍?面向?qū)ο?Object Oriented,OO)是軟件開發(fā)方法 對(duì)象:萬(wàn)物皆對(duì)象,對(duì)象可以是具體的事物,也可以是抽象...
摘要:入坑指南是滴,下面是一個(gè)最低的入坑還應(yīng)該有種設(shè)計(jì)模式應(yīng)該掌握的。堆棧以幀為單位保存線程的狀態(tài),對(duì)堆棧的操作為壓棧和出棧執(zhí)行字節(jié)碼以后,將會(huì)產(chǎn)生程序計(jì)數(shù)器和棧,程序計(jì)數(shù)器存放將要執(zhí)行下一條指令的偏移量。 Java入坑指南是滴,下面是一個(gè)最低的入坑 還應(yīng)該有23種設(shè)計(jì)模式應(yīng)該掌握的。╮(╯▽╰)╭注意,第一個(gè)j是大寫。 Java的特點(diǎn)跨平臺(tái),風(fēng)格接近C++最重要的api文檔 https:/...
閱讀 1972·2021-11-16 11:45
閱讀 3690·2021-09-06 15:02
閱讀 2033·2019-08-30 15:44
閱讀 2295·2019-08-30 11:21
閱讀 1860·2019-08-29 16:31
閱讀 3436·2019-08-29 13:55
閱讀 1907·2019-08-29 12:15
閱讀 3259·2019-08-28 18:05