標籤:設計模式 singleton
前言
在編程過程中總結歸納出來的一種編程經驗,從而形成的設計思想稱為設計模式。
設計模式有23種。它適用於所有的程式設計語言。
常用的有創新型的設計模式:簡單工廠、抽象工廠和單例模式;行為型的設計模式:模板設計模式、觀察者模式和命令模式;結構性的設計模式:適配器設計模式、代理模式(靜態和動態兩種,典型的有在spring的AOP編程中使用)和裝飾器設計模式。
本文單例模式(singleton)
保證一個類在記憶體中只能建立一個執行個體。
1.實現步驟:
1)將構造器私人化,即使用private修飾構造器
2)提供靜態私人的屬性,類型為要建立的物件類型。
3)提供一個返回在類內部建立的對象的靜態方法。
註:
1.飽漢式的單例模式是等到外界第一次請求對象時才建立對象。
應用情境:對象比較小,建立過程消耗的時間少。
飽漢式是典型的時間換取空間。
飽漢式程式碼範例:
2.餓漢式是當程式一啟動就立即產生對象載入到記憶體中。
應用情境:對象比較大,建立過程消耗的時間多。
飽漢式是典型的空間換取時間。
餓漢式程式碼範例:
簡單工廠
對調用者封裝對象的建立過程,提供產品。
使用工廠封裝對象的建立過程。
1.實現步驟:
1)定義介面規範。
該介面是工廠中建立的對象必須實現的介面。
定義介面的方法時,避免體系技術的特點;比如:對於資料庫的操作,避免在介面中適應SQLException.
2)定義實作類別
該類是工廠需要建立的對象的模板,實現定義的介面。
3)構建工廠:採用抽象類別
在工廠類中提供一個靜態方法,方法的返回值類型為介面類型,用於動態綁定工廠中生產出得各種對象。
2.應用情境:
根據使用者的不同需要產生不同的對象,這些對象都是同一類型的,且具有相同的行為
3.作用
能適應不同的使用者的不同需求,根據不同的需求產生對應的對象,達到屏蔽對象的建立過程的目的。
4.簡單工廠與放射結合使用的實現步驟
1)定義介面
2)提供具體的實作類別
3)提供設定檔
配置類的基本資料:key="類的全限定名"
4)提供工廠類的實現
根據設定檔資訊,通過外界傳來的key,擷取對應的全限定名。
程式碼範例:
抽象工廠
抽象工廠用於不同產品的實現;比如一些易於交換產品系列,它們只需改變具體工廠即可。
例如:一個開發中可能有mySql的資料庫和oracle的資料庫。
1.具體樣本步驟:
1)定義介面
定義訪問資料庫的方法
IOrderDao-->addOrder方法//使用者訪問方式
IUserDao-->addUser方法////訂單的訪問方式
註:
訪問資料庫的方式與資料庫產品無關,只和業務有關。
2)提供介面的實現:抽象產品的具體分類實現
不同的資料庫產品他的操作方式不同
1))針對oracle的實現
OracleUserDaoImpl implements IUserDao
OracleOrderDaoImpl implements IOrderDao
2))針對mySql的實現MySqlUserDaoImpl implements IUserDao
MySqlOrderDaoImpl implements IOrderDa
3)提供抽象工廠類
該類應該包含所有的建立資料庫產品的工廠的抽象方法
4)針對不同的資料庫產品提供資料庫的工廠
5)測試:通常在運行時刻建立一個ConcreteFactory類的執行個體
DaoFactory daoFacotry=DaoFactory.getInstance("mysql");
UserDao userDao=daoFactory.getUserDao();
註:建立具體的工廠,再建立具有特定實現的產品對象。也就是說,為了建立不同的產品對象,用戶端應使用不同的具體工廠。
模板設計模式(Template)
在一個類中定義操作的骨架,細節交給子類完成
開發步驟:
1.定義一個抽象類別
|-定義演算法的骨架(方法實現的半成品)
|-定義一個抽象方法由抽象類別當中的執行個體方法調用同時交給子類來實現。
應用情境:
jdbc操作資料庫的更新與刪除
原理:
子類重寫父類的方法
定義演算法架構在一個方法裡,某些步驟延遲到子類。模板方法設計模式讓子類定義演算法的某些步驟,而不需要改變演算法的結構。
程式碼範例:
2)抽象類別的骨架
1)子類實現骨架的某些步驟
裝飾器設計模式(decorator)
1.意圖在運行時通過組合操作產生新的變化。IO流中的輸入輸出就是一個典型案例
裝飾器動態給對象增加職責。裝飾器提供了一個比繼承更好地彈性的方案。
程式碼範例:
2.裝飾者可以在被委託的對象之前或之後,把它的行為加上,以便完成剩下的任務。
當然,它的缺點是造成大量的小類
3.原理:裝飾器為被裝飾器提供裝飾的原料。
舉例:節點檔案流是裝飾器,檔案流擷取的資料來填充緩衝流中的緩衝池,檔案中的資料來修飾緩衝池。
程式碼範例:
1)類結構
2)Person介面
3)Man實現了
4)Decorator適配器類
5)適配器的子類DecA
6)適配器的子類DecB
7)測試類別
適配器設計模式(adapter)
經常使用一些support或adapter的單詞來表示適配器的類。
在jdk的swing中的事件監聽器應用了該設計模式。
1.使原來由於介面不相容的類在一起協同工作
程式碼範例:a類和b類的介面不相容,一起協同工作的執行個體
1)A類的介面
2)A類的代碼
3)B類的代碼
4)測試類別
2.適配器的類
* |-初始化一些資源,直接提供給子類使用
* |-子類可以只關心功能,需要實現什麼功能重寫什麼方法
程式碼範例:
1)介面包含了很多的方法
2)通過繼承實現了介面的類,來解決必須重寫所有的介面方法的問題
3)子類可以只關心功能,需要實現什麼功能重寫什麼方法
總結
1.簡單描述一下其他的設計模式:
1)狀態設計模式:允許對象在內部的狀態改變時,改變它的行為。達到對象看起來就像修改了它的類的效果。
2)策略模式:定義一組演算法家族,封裝每個演算法並使之可互換。策略模式讓客戶可以獨立地應對演算法的變化。
3)觀察者模式:定義一對多的關係,當一個對象改變時,所有的依賴者都會自動得到通知和更新。它在jdk中的應用有javaBean和swing。