概述
設計模式代表了最佳的實踐,通常被有經驗的面向對象的軟件開發(fā)人員所采用。設計模式是軟件開發(fā)人員針對某一類問題的最優(yōu)解決方案,是從許多優(yōu)秀的軟件系統(tǒng)中總結出來的。
使用設計模式的目的:為了提高代碼的可重用性钝鸽、讓代碼更容易被他人理解、保證代碼可靠性庞钢,讓代碼編寫更加工程化拔恰。
Java中設計模式通常有23種。
1.大致可分為3類:創(chuàng)建型基括、行為型和結構型颜懊。
設計模式的六大原則
2.開閉原則
開閉原則的意思是:對擴展開放,對修改關閉。在程序需要進行拓展的時候河爹,不能去修改原有的代碼匠璧,實現一個熱插拔的效果。簡言之咸这,是為了使程序的擴展性好夷恍,易于維護和升級。想要達到這樣的效果媳维,我們需要使用接口和抽象類
3.里氏轉換原則
里氏代換原則是面向對象設計的基本原則之一酿雪。里氏代換原則中說,任何基類可以出現的地方侄刽,子類一定可以出現指黎。LSP 是繼承復用的基石,只有當派生類可以替換掉基類唠梨,且軟件單位的功能不受到影響時袋励,基類才能真正被復用侥啤,而派生類也能夠在基類的基礎上增加新的行為当叭。里氏代換原則是對開閉原則的補充。實現開閉原則的關鍵步驟就是抽象化盖灸,而基類與子類的繼承關系就是抽象化的具體實現蚁鳖,所以里氏代換原則是對實現抽象化的具體步驟的規(guī)范。
依賴倒轉原則
這個原則是開閉原則的基礎赁炎,具體內容:針對接口編程醉箕,依賴于抽象而不依賴于具體
4. 接口隔離原則
這個原則的意思是:使用多個隔離的接口,比使用單個接口要好徙垫。它還有另外一個意思是:降低類之間的耦合度讥裤。由此可見,其實設計模式就是從大型軟件架構出發(fā)姻报、便于升級和維護的軟件設計思想己英,它強調降低依賴,降低耦合吴旋。
5.迪米特法則损肛,又稱最少知道原則
最少知道原則是指:一個實體應當盡量少地與其他實體之間發(fā)生相互作用,使得系統(tǒng)功能模塊相對獨立荣瑟。
6. 合成復用原則
合成復用原則是指:盡量使用合成/聚合的方式治拿,而不是使用繼承。
創(chuàng)建型模式
創(chuàng)建型模式設計對象的實例化笆焰,特點是不讓用戶代碼依賴于對象的創(chuàng)建或排列方式劫谅,避免用戶直接用new創(chuàng)建對象。
創(chuàng)建型模式有5種。
工廠模式同波、抽象工廠模式鳄梅、建造者模式、原型模式和單列模式
工廠模式
工廠模式是java中最常見的設計模式之一未檩,它提供了一種創(chuàng)建對象的最佳方式戴尸。在工廠模式中,我們在創(chuàng)建對象時不會對客戶端暴露創(chuàng)建邏輯冤狡,并且是通過使用一個共同的接口來指向新創(chuàng)建的對象孙蒙。
目的:定義一個創(chuàng)建對象的接口,讓子類自己去決定實例化那個產品類悲雳,也就是子類去實現接口
注意事項:
作為一種創(chuàng)建類模式挎峦,在任何需要生成復雜對象的地方,都可以使用工廠方法模式合瓢。有一點需要注意的地方就是復雜對象適合使用工廠模式坦胶,而簡單對象,特別是只需要通過 new 就可以完成創(chuàng)建的對象晴楔,無需使用工廠模式顿苇。如果使用工廠模式,就需要引入一個工廠類税弃,會增加系統(tǒng)的復雜度纪岁。
抽象工廠模式
抽象工廠模式(Abstract
Factory Pattern)是圍繞一個超級工廠創(chuàng)建其他工廠。該超級工廠又稱為其他工廠的工廠则果。這種類型的設計模式屬于創(chuàng)建型模式幔翰,它提供了一種創(chuàng)建對象的最佳方式。
在抽象工廠模式中西壮,接口是負責創(chuàng)建一個相關對象的工廠遗增,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象款青。
意圖:提供一個創(chuàng)建一系列相關或相互依賴對象的接口做修,而無需指定它們具體的類。
兩種設計模式主要的區(qū)別在于產品可都,工廠模式是用來創(chuàng)建同一個產品的不同類型的缓待,而抽象工廠模式是用來創(chuàng)建不同類的產品。一般來說渠牲,產品種類單一旋炒,適合用工廠模式;如果有多個签杈;多種類型時瘫镇,通過抽象工廠模式來創(chuàng)建時很合適的鼎兽。
單例模式
單例模式是Java最簡單的設計模式,這種設計模式屬于創(chuàng)建型模式铣除,它提供了一種創(chuàng)建對象的最佳方式谚咬。
這種設計模式涉及到一個單一的類,該類負責創(chuàng)建自己的對象同時確保只有單個對象被創(chuàng)建尚粘。這個類提供了一種訪問其唯一的對象的方式择卦,可以直接訪問,不需要實例化該類的對象郎嫁。
注意:
單例類只能有一個實例秉继。
單例類必須自己創(chuàng)建自己的唯一實例
單例類必須給所有其他對象提供這一實例關鍵代碼:構造函數是私有的。
建造者模式
建造者模式使用多個簡單的對象一步步構建成復雜的對象泽铛。這種類型的設計模式屬于創(chuàng)建型設計模式尚辑,它提供了一種創(chuàng)建對象的最佳方式。
一個Builder類會一步一步構造最終的對象盔腔。該Builder類是獨立于其他對象的杠茬。
原型模式
原型模式是用于創(chuàng)建重復的對象,同時又能保證性能弛随。這種類型的設計模式屬于創(chuàng)建型模式瓢喉,它提供了一種創(chuàng)建對象的最佳方式。
這種設計模式是實現了一個原型接口撵幽,該接口用于創(chuàng)建當前對象的克隆灯荧。當直接創(chuàng)建對象的代價比較大時礁击,則采用這種模式盐杂。
意圖:用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象哆窿。
關鍵代碼:實現cloneable接口链烈,重寫clone()方法。當通過new產生一個對象需要非常繁瑣的數據準備或訪問權限挚躯,或者類初始化消耗非常多的資源强衡,這個資源包括數據、硬件資源時码荔′銮冢可以使用原型模式
裝飾者模式
裝飾器模式(Decorator Pattern)允許向一個現有的對象添加新的功能,同時又不改變其結構缩搅。這種類型的設計模式屬于結構型模式越败,它是作為現有的類的一個包裝。
這種模式創(chuàng)建了一個裝飾類硼瓣,用來包裝原有的類究飞,并在保持類方法簽名完整性的前提下,提供了額外的功能。
意圖:動態(tài)地給一個對象添加一些額外的職責亿傅。就增加功能來說媒峡,裝飾器模式相比生成子類更為靈活。
主要解決:一般的葵擎,我們?yōu)榱藬U展一個類經常使用繼承方式實現谅阿,由于繼承為類引入靜態(tài)特征,并且隨著擴展功能的增多酬滤,子類會很膨脹奔穿。
何時使用:在不想增加很多子類的情況下擴展類。
舉例
裝飾模式:以對客戶端透明的方式擴展對象的功能敏晤,是繼承關系的一個替代方案贱田;代理模式:給一個對象提供一個代理對象,并有代理對象來控制對原有對象的引用嘴脾;
裝飾模式應該為所裝飾的對象增強功能男摧;代理模式對代理的對象施加控制,并不提供對象本身的增強功能
裝飾者模式的定義:動態(tài)的將責任附加到被裝飾者對象上译打,用于擴展對象的功能耗拓。比繼承的靈活性大。典型的如Java IO的設計即是裝飾者模式的典型應用奏司∏茄 代理模式模式的定義:對其他對象進行代理,以控制對被代理對象的訪問韵洋。Spring的為業(yè)務邏輯層方法生成的代理類竿刁,主要進行一些事務控制等。由定義可以看出裝飾的責任是擴展功能 搪缨,而代理主要控制訪問食拜。
動態(tài)代理技術:動態(tài)代理技術就是用來產生一個對象的代理對象。
代理對象的價值:
1.代理對象存在的價值主要用于攔截對真實業(yè)務對象的訪問副编。2.代理對象應該具有和目標對象(真實業(yè)務對象)相同的方法负甸。
Java中的代理:java.lang.reflect.Proxy類
要生成某一個對象的代理對象,這個代理對象通常也要編寫一個類來生成痹届,java在JDK1.5之后提供了一個"java.lang.reflect.Proxy"類呻待,通過"Proxy"類提供的一個newProxyInstance方法用來創(chuàng)建一個對象的代理對象。
newProxyInstance方法用來返回一個代理對象队腐,這個方法總共有3個參數蚕捉,ClassLoader loader用來指明生成代理對象使用哪個類裝載器,Class<?>[]
interfaces用來指明生成哪個對象的代理對象香到,通過接口指定鱼冀,InvocationHandler h用來指明產生的這個代理對象要做什么事情
注意:在java中規(guī)定报破,要想產生一個對象的代理對象,那么這個對象必須要有一個接口