天天看點

設計模式大綱

1:單例模式:一般由spring的bean工廠保證

餓漢式:類加載的時候就會建立

懶漢式:使用時才建立,會造成線程不安全

解決方法:

方法上加鎖,會降低效率

同步代碼快加鎖,達不到單例效果,需要雙重檢查加鎖。

枚舉單例:沒有構造方法,可以防止序列化,也可以線程同步。

内部類:内部類傳回一個外部類執行個體,JVM隻會加載一次類,加載外部類時也不會加載内部類

2:政策模式

java.util.Comparator接口和java.lang.Comparable接口

需求:一開始是對int[]排序,然後又想對float[]排序

解決方法:讓排序的對象自己實作Comparable接口 ,重寫compTo(T t)方法

Comparator才是政策模式,開閉原則 根據需求更換不同的比較器,更換政策。compare(T o1,T o2)

使用方法:建立各種政策的對象,全部實作接口A,一個随着政策改變的對象,有A屬性,以及A中的方法

3:工廠模式

工廠:可以産生對象的方法和類,都可以稱為工廠,單例也是一種工廠

靈活控制生産過程可以權重限,修飾,日志,友善産品的擴充

簡單工廠:工廠方法,産品單一容易擴充

使用工廠類去new對象,每添加一種對象,需要建立一個生産工廠

靜态工廠:抽象工廠,在産品族容易擴充:工廠的工廠

spring 的Bean工廠

4、5:門面和調停者模式

門面模式:又稱外觀模式,對外Facade:将内部關系封裝,提供一個簡單的接口供外界調用。

調停者模式:又稱中介者模式,對内解耦,減少互相打交道,抽出一個部分,其他的都與這個打交道,例如消息中間件

用處:ddd模型

6:裝飾者模式

給一個類加上裝飾,比如外殼,英雄加血條,加尾巴,但是不改變其結構。

一般使用聚合interface,而不是繼承

7:責任鍊模式(第二難,僅次于代理模式)

需求:在論壇發表文章,背景經過資訊處理才可以發表或者進入資料庫,多重過濾

用處:request和response的過濾器鍊,一個過濾器正向過濾request,反向過濾response.,類似于遞歸的方法,可以參考Filter的API

8:觀察者模式(詳細掌握,優先掌握),鈎子函數,回調函數

構成:一般有三部分:被觀察者,發生事件,觀察者。被觀察者發生事件,觀察者根據事件做出反應

用處:spring的切面

難點:觀察者如何取到事件源?

解決方法:事件源有source屬性,傳回事件源對象,處理過程根據源對象的不同而不同

9:組合模式(樹狀結構專用模式)

使用場景:節點下有可以隻有子節點,也可以隻有葉子節點,也可以二者都有。

10:享元模式:共享中繼資料,放在池子裡

使用場景:元素頻繁使用,無需重複new,隻需要池子裡取即可。例如:連接配接池 ,線程池。

11:代理模式(第一難):分離代理行為和備代理對象

jdk的動态代理:Proxy.newProxyInstance(類加載器 ,被代理對象實作的接口數組 ,調用被代理對象需要執行的在invoke裡編寫),底層用的是asm

缺點:要求被代理類必須要實作接口

cglib動态代理:生成的代理類是被代理類的子類 ,底層用的是asm

缺點:如果被代理類被final修飾了,就無法使用。

spring的aop:面向切面

12:疊代器模式

使用場景:容器與容器周遊:容器實作傳回Iterator(),這個是内部類,裡面包括hasNext()和next()兩個方法

13:通路者模式:在結構不變的情況下動态改變對于内部元素的動作

使用場景:編譯器的文法分析,抽象文法樹,平常開發用到的情況不多。

14:構模組化式:建構複雜對象

builder模式将複雜對象分割成多個簡單對象,分别建構,最後生成總的對象,多采用鍊式build

15:擴充卡模式:相當于轉換器

使用場景:讀取檔案的流式轉化,ddd模型的各個bean的轉化,java通路Sql server資料庫的JDBC到ODBC的轉化

16:橋接模式:雙次元擴充,用到的不多。

分離抽象和具體,用聚合的方式連接配接抽象和具體。

17:封裝指令模式:又稱事務,動作模式

常用來實作do和undo功能

command模式與組合模式實作宏指令

command模式與記憶模式實作事務的復原

command模式與責任鍊模式可以實作多次undo

18:原型模式,也叫克隆模式

java自帶原型模式

實作原型模式需要實作标記型接口Cloneable,然後重寫clone()方法;不實作接口直接重寫clone()方法,運作時報CloneNotSupportedException 異常

使用場景:一般用于一個對象的屬性已經确定,需要産生很多相同對象的時候

區分深克隆和淺克隆:淺克隆修改一個new出來對象的值,其他的都改變;深克隆則不是

19:備忘錄模式,和封裝指令模式的undo很像

使用場景:記錄快照(瞬時狀态),存盤,便于恢複和復原

20:序列化模式

使用場景:将某個對象原封不動的寫到硬碟上,必須實作Serializable辨別接口;load時需要按照順序讀取

反序列化:transient ,加了這個關鍵字的不序列化

21:模闆方法模式:鈎子函數,诠釋開閉原則

在父類也就是抽象類中對接口部分方法進行實作,留出一部分方法給子類進行實作。定義了一個算法也就是模闆, 子類隻需要實作某個方法即可獲得全部算法實作。

使用方法:一般是抽象類去實作接口中的部分方法,作為父類;子類去繼承父類,隻需要實作其他的接口即可,但是卻可以調用所有的接口方法。

注意:抽象類不能直接new出來使用,隻能通過抽象類派生出新的子類,由子類來建立對象

22:狀态模式:根據狀态決定行為

使用場景:很多需要根據行為state做出不同的行為

使用方法:将state抽取出來,可以是接口/抽象類,state中定義方法;讓不同的狀态類去繼承或者實作state,重寫方法

23:解釋器模式,基本不用

使用場景:動态解析腳本,比如解析正規表達式,解釋一門語言