標籤:表示 獨立 因此 按鈕 不同的 著圖 用戶端 延遲 runtime類
建立型
- Factory 方法模式
說明:使用不同的工廠生產不同的產品
例:生產電視機的工廠,生產不同品牌的手機,如果只有一個工廠類,當需要增加一個品牌的手機時就需要修改代碼,違反了開閉原則
改進:定義一個工廠介面,再定義不同的實作類別分別去生產不同品牌的手機,增加品牌時只需要增加一個實作類別即可
定義:Factory 方法模式又稱為原廠模式,工廠父類負責定義建立產品對象的公用介面,而工廠子類則負責產生具體的產品對象,這樣做的目的是將產品類的執行個體化操作延遲到工廠子類中完成,即通過工廠子類來確定究竟應該執行個體化那一個具體產品類
應用:如集合架構,Collection定義了iterator()。可返回一個用於遍曆集合的Iterator(迭代器)對象,而具體的集合類通過實現該方法返回一個具體的Iterator對象,該iterator()方法就是Factory 方法
- 抽象原廠模式
說明:具體的工廠生產不再是生產某一種產品,而是生產一系列產品
例:海爾工廠生產海爾電視機、海爾空調;TCL工廠生產TCL電視機、TCL空調
定義:提供一個建立一系列相關或相互依賴的對象的介面,而無需指定他們具體的類
- 單例模式
例:社會安全號碼碼是唯一的
靜態私人成員變數、私人建構函式、靜態公有擷取執行個體的方法
定義:確保某一個類只有一個執行個體,而且自行執行個體化並向整個系統提供這個執行個體,這個類成為單例類,它提供全域訪問的方法
應用:如java.lang.Runtime類,每個Java應用程式裡,都有唯一的一個Runtime對象,通過這個對象可以與其運行環境發生相互作用。
在流行的JavaEE架構Spring中,當我們試圖從spring容器中擷取某個類的執行個體時,預設情況下,spring會通過單例模式進行建立,也就是在spring的bean工廠中這個bean的執行個體只有一個
<bean id = "date" class = "java.util.Date" scope = "singleton"/>
結構型
- 適配器模式
將一個介面轉換成客戶希望的另一個介面,從而使介面不相容的那些類可以一起工作
定義:將一個介面轉換成客戶希望的另一個介面,適配器模式使介面不相容的那些類可以一起工作,其別名為封裝器
應用:資料庫連接工具JDBC,使得程式能夠與資料庫連接,並使用SQL語言來查詢和操作資料。JDBC給出一個用戶端通用的抽象介面,每一個具體資料庫引擎(如SQL Server、Oracle、MySQL等)的JDBC驅動軟體都是一個介於JDBC介面和資料庫引擎介面之間的適配器軟體。抽象的JDBC介面和各個資料庫引擎API之間都需要相應的適配器軟體,這就是為各個不同資料庫引擎準備的驅動程式
- 面板模式
例:網站首頁的導覽列,可以進入不同的子系統
定義:外部與一個子系統的通訊必須通過一個統一的外觀對象進行,為子系統中的一組介面提供一個一致的介面,面板模式定義了一個高層介面,這個介面使得這一子系統更加容易使用
面板模式是一個使用頻率極高,理解比較容易的模式,在幾乎所有的軟體中都能見到面板模式的應用,比如絕大多數的B/S系統都有一個首頁或者導航頁面,在這裡,首頁和導航頁面就是外觀角色
- 代理模式
例:找女票,工作忙不能親自找,找個婚介所(代理、中介、、、)
在某些情況下,一個客戶不能或不想直接引用某個對象,此時可以通過一個稱之為“代理”的第三者實現間接引用,代理對象起到中介作用,可以通過代理對象去掉客戶能看到的內容和服務或者添加客戶需要的額外服務
定義:給某一個對象提供一個代理,並由代理對象控制對原對象的引用
應用:spring架構中的AOP技術也是代理模式的應用
行為型
- 迭代器模式
例:看電視,通過遙控器,可以看不同的頻道,電視機中有很多頻道,通過遙控器遍曆,而不需要知道這些頻道在電視機內部是怎麼儲存的
定義:提供一種方法來訪問彙總對象,而不用暴露這個對象的內部表示
應用:Collection中的iterator()
在Java中,很少自訂迭代器,使用JDK內建的迭代器即可
- 觀察者模式
例:點擊一個按鈕,彈出一個對話方塊;股票上漲,股民興奮 在這裡,按鈕、股民是觀察者,滑鼠、股票是觀察者所觀察的目標
MVC架構中,Model提供的資料是視圖層所觀察的對象,相同的資料在view層可能有不同的表現形式,如果模型層資料發生變化,則圖表對象也發生改變,意味著圖表對象依賴於模型層提供的資料對象,因此資料對象的任何狀態改變都應該立即通知它們
定義:定義對象間一種一對多的關係,使得每當一個對象發生改變時,其相關的依賴對象皆得到通知並自動更新
- 策略模式
用於演算法的自由切換和擴充
定義:定義一些列演算法,將每一個演算法封裝起來,並讓他們可以相互替換。策略模式讓演算法獨立預使用它們的客戶而變化
策略模式的目的是將演算法的定義預使用分開,也就是將演算法的行為和環境分開,將演算法的定義放在專門的策略類中,每一個策略類封裝了一種演算法實現,同時為了擴充方便,引入了抽象策略類,在抽象策略類中定義了抽象演算法,環境類針對抽象策略類進行編程,符合“依賴倒轉原則”。在出現心得演算法時,只需要增加一個心得實現了抽象策略類的具體策略類。
Java面試——設計模式