23種設計模式總篇:chenmingyu.top/categories/…
抽象工廠
抽象工廠模式屬於建立型模式
定義:為建立一組相關或相互依賴的物件提供一個介面,而且無須指定它們的具體類
抽象工廠模式是對工廠方法模式的擴充套件,抽象工廠比工廠模式更為抽象,工廠方法模式針對產品等級結構,而抽象工廠針對產品族。
產品族與產品等級結構的概念:
產品族,是指位於不同產品等級結構中,功能相關聯的產品組成的家族,比如遊戲工廠生產射擊類和塔防類兩種產品,任天堂的射擊類遊戲和塔防類遊戲為一個產品族,騰訊的射擊類遊戲和塔防類遊戲為一個產品族
產品等級結構,一個產品族由多個產品等級結構組成,射擊類遊戲是一個產品等級結構,塔防類遊戲也是一個產品等級結構
抽象工廠模式類圖
以遊戲為例,定義一個抽象工廠,生產射擊和塔防兩種遊戲,有兩個具體的生產工廠,任天堂和騰訊,兩個工廠生產各自品牌的兩類遊戲產品
角色:
- 抽象工廠:
GameFactory
,規定了生成射擊類和塔防類兩種遊戲 - 具體工廠:
NintendoGameFactory
,TencentGameFactory
,負責生產各自品牌的射擊類和塔防類遊戲 - 抽象產品:
Gameable
,ShootGame
和TowerDefenceGame
是抽象類,實現Gameable
- 具體產品:
NintendoShootGame
,NintendoTowerDefenceGame
,TencentShootGame
,TencentTowerDefenceGame
優點
- 介面和實現分離,客戶端面向介面程式設計,不用關心具體實現,從具體的產品實現中解耦
- 增加新的具體工廠和產品族方便,切換產品族方便
缺點
不易增加新的產品,如果要增加新的產品需要抽象工廠和所有具體工廠
模式程式碼實現
GameFactory
抽象工廠,規定了生產射擊和塔防兩類遊戲
/**
* @author: chenmingyu
* @date: 2019/2/14 11:29
* @description: 工廠類
*/
public interface GameFactory {
/**
* 建立射擊遊戲
* @return
*/
Gameable createShootGame();
/**
* 建立塔防遊戲
* @return
*/
Gameable createTowerDefenceGame();
}
複製程式碼
NintendoGameFactory
具體工廠,負責生產任天堂的射擊類和塔防類遊戲
/**
* @author: chenmingyu
* @date: 2019/2/14 18:20
* @description: 任天堂遊戲製造廠
*/
public class NintendoGameFactory implements GameFactory{
@Override
public Gameable createShootGame() {
return new NintendoShootGame();
}
@Override
public Gameable createTowerDefenceGame() {
return new NintendoTowerDefenceGame();
}
}
複製程式碼
TencentGameFactory
具體工廠,負責生產騰訊的射擊類和塔防類遊戲
/**
* @author: chenmingyu
* @date: 2019/2/14 18:20
* @description: 騰訊遊戲製造廠
*/
public class TencentGameFactory implements GameFactory {
@Override
public Gameable createShootGame() {
return new TencentShootGame();
}
@Override
public Gameable createTowerDefenceGame() {
return new TencentTowerDefenceGame();
}
}
複製程式碼
Gameable
抽象產品,所有遊戲產品均實現該介面
/**
* @author: chenmingyu
* @date: 2019/2/14 11:19
* @description: 遊戲介面
*/
public interface Gameable {
/**
* 校驗賬戶資訊
* @param nickName
*/
void validateAccount(String nickName);
/**
* 遊戲型別
*/
void getGameType();
}
複製程式碼
ShootGame和TowerDefenceGame
抽象類,實現Gameable介面
/**
* @auther: chenmingyu
* @date: 2019/2/14 11:26
* @description: 射擊類遊戲
*/
public abstract class ShootGame implements Gameable{
@Override
public void validateAccount(String nickName) {
System.out.println("射擊遊戲校驗暱稱:"+nickName);
}
}
複製程式碼
/**
* @auther: chenmingyu
* @date: 2019/2/14 11:28
* @description: 塔防類遊戲
*/
public abstract class TowerDefenceGame implements Gameable{
@Override
public void validateAccount(String nickName) {
System.out.println("塔防遊戲校驗暱稱:"+nickName);
}
}
複製程式碼
具體產品
共四款遊戲產品:NintendoShootGame
,NintendoTowerDefenceGame
,TencentShootGame
,TencentTowerDefenceGame
/**
* @author: chenmingyu
* @date: 2019/2/15 16:57
* @description: 任天堂射擊遊戲
*/
public class NintendoShootGame extends ShootGame{
@Override
public void getGameType() {
System.out.println("任天堂射擊遊戲");
}
}
複製程式碼
/**
* @author: chenmingyu
* @date: 2019/2/15 17:18
* @description: 任天堂塔防遊戲
*/
public class NintendoTowerDefenceGame extends TowerDefenceGame{
@Override
public void getGameType() {
System.out.println("任天堂塔防遊戲");
}
}
複製程式碼
/**
* @author: chenmingyu
* @date: 2019/2/15 16:55
* @description: 騰訊射擊遊戲
*/
public class TencentShootGame extends ShootGame {
@Override
public void getGameType() {
System.out.println("騰訊射擊遊戲");
}
}
複製程式碼
/**
* @author: chenmingyu
* @date: 2019/2/15 17:17
* @description: 騰訊塔防遊戲
*/
public class TencentTowerDefenceGame extends TowerDefenceGame{
@Override
public void getGameType() {
System.out.println("騰訊塔防遊戲");
}
}
複製程式碼
驗證
public static void main(String[] args) throws Exception{
NintendoGameFactory nintendoGameFactory = new NintendoGameFactory();
nintendoGameFactory.createShootGame().getGameType();
nintendoGameFactory.createTowerDefenceGame().getGameType();
TencentGameFactory tencentGameFactory = new TencentGameFactory();
tencentGameFactory.createShootGame().getGameType();
tencentGameFactory.createTowerDefenceGame().getGameType();
}
複製程式碼
輸出
任天堂射擊遊戲
任天堂塔防遊戲
騰訊射擊遊戲
騰訊塔防遊戲
複製程式碼
參考
菜鳥教程:www.runoob.com/design-patt…
圖說設計模式:design-patterns.readthedocs.io/zh_CN/lates…
相關閱讀
建立型設計模式
關注於如何建立物件
-
保證在程式執行期間一個類只有一個例項,並提供一個全域性訪問點
-
用工廠方法代替new操作,讓子類去決定例項化哪個類,工廠方法將一個類的例項化延遲到子類
-
抽象工廠模式屬於建立型模式,是對工廠方法模式的擴充套件,抽象工廠比工廠模式更為抽象,工廠方法模式針對產品等級結構,而抽象工廠針對產品族
-
通過克隆一個已經存在的物件例項來返回新的例項,而不是通過new去建立物件
-
通過克隆一個已經存在的物件例項來返回新的例項,而不是通過new去建立物件
結構型設計模式
關注於類和物件之間的關係
-
組合兩個不相干類,在兩個不相容的介面之間提供一個混合介面,使其相容適配
-
將抽象部分與它的實現部分分離,使它們都可以獨立地變化。橋接模式將系統各維度抽象出來,各維度獨立變化,之後可通過聚合,將各維度組合起來,減少它們之間耦合
-
用來描述部分與整體的關係,是用於把一組相似的物件當作一個單一的物件。組合模式依據樹形結構來組合物件,所以組合模式的使用場景就是出現樹形結構的地方。
-
裝飾器模式可以為一個現有的類增加新功能,又不改變其結構,要求裝飾類和被裝飾類實現同一個介面,裝飾類持有被裝飾類的例項
-
外觀模式是為了解決類與類之家的責任關係和依賴關係的,通過提供一個Facade類來隱藏這些複雜的類之間關係的呼叫,並提供一個介面,供外部呼叫,利用這種方式進行類之間的解耦
-
代理模式就是在操作原物件的時候,多出來一個代理類,用來對原物件的訪問進行控制和替代原物件進行一些操作
-
運用共享技術有效地支援大量細粒度物件的複用,主要用來減少物件的建立,用來減少記憶體和提高效能,比較常見的連線池,緩衝池這類的池技術都是享元模式
行為型設計模式
關注於物件之間的通訊
-
在父類(抽象類)中定義好演算法的流程,提供抽象方法,針對不同的實現交由不同的子類去實現,通過這種方式將公共程式碼提取出來封裝在父類中,然後父類去控制行為,子類負責實現
-
在系統中提供一組策略,並將每個策略封裝成類,使他們可以相互轉換,具體策略的選擇由客戶端決定
-
定義物件間一種一對多的依賴關係,使得每當一個物件改變狀態,則所有依賴於它的物件都會得到通知並被自動更新
-
迭代器模式就是為解決遍歷元素而誕生的,它提供一種方法訪問一個容器物件中各個元素,而又不需暴露該物件的內部細節
-
使多個物件都有機會處理請求,從而避免了請求的傳送者和接受者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止
-
將一個請求封裝成一個物件,從而讓你使用不同的請求把客戶端引數化,對請求排隊或者記錄請求日誌,可以提供命令的撤銷和恢復功能,用來降低類之間解耦
-
在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到原先儲存的狀態,其實就是在某個時刻備份了物件的狀態,在更改物件狀態後,可以通過備份將物件還原成備份時刻的狀態
-
允許一個物件在其內部狀態改變時改變它的行為,物件看起來似乎修改了它的類,物件的行為依賴於它的狀態(屬性),並且可以根據它的狀態改變而改變它的相關行為
-
封裝一些作用於某種資料結構中的各元素的操作,它可以在不改變資料結構的前提下定義作用於這些元素的新的操作,訪問者模式就是將資料結構與資料操作相分離
-
用一箇中介物件來封裝一系列的物件互動,中介者使各物件不需要顯式地相互引用,從而使其耦合鬆散,而且可以獨立地改變它們之間的互動
-
給定一門語言,定義它的文法的一種表示,並定義一個直譯器,該直譯器使用該表示來解釋語言中的句子