設計模式詳解 - 抽象工廠

23種設計模式詳解:chenmingyu.top/design/html

本文源碼github.com/mingyuHub/d…java

抽象工廠

抽象工廠模式屬於建立型模式git

定義:爲建立一組相關或相互依賴的對象提供一個接口,並且無須指定它們的具體類github

抽象工廠模式是對工廠方法模式的擴展,抽象工廠比工廠模式更爲抽象,工廠方法模式針對產品等級結構,而抽象工廠針對產品族。算法

產品族與產品等級結構的概念:編程

​ 產品族,是指位於不一樣產品等級結構中,功能相關聯的產品組成的家族,好比遊戲工廠生產射擊類和塔防類兩種產品,任天堂的射擊類遊戲和塔防類遊戲爲一個產品族,騰訊的射擊類遊戲和塔防類遊戲爲一個產品族設計模式

​ 產品等級結構,一個產品族由多個產品等級結構組成,射擊類遊戲是一個產品等級結構,塔防類遊戲也是一個產品等級結構數據結構

抽象工廠模式類圖

以遊戲爲例,定義一個抽象工廠,生產射擊和塔防兩種遊戲,有兩個具體的生產工廠,任天堂和騰訊,兩個工廠生產各自品牌的兩類遊戲產品ide

角色性能

  1. 抽象工廠:GameFactory,規定了生成射擊類和塔防類兩種遊戲
  2. 具體工廠:NintendoGameFactoryTencentGameFactory,負責生產各自品牌的射擊類和塔防類遊戲
  3. 抽象產品:GameableShootGameTowerDefenceGame是抽象類,實現Gameable
  4. 具體產品:NintendoShootGameNintendoTowerDefenceGameTencentShootGameTencentTowerDefenceGame

優勢

  1. 接口和實現分離,客戶端面向接口編程,不用關心具體實現,從具體的產品實現中解耦
  2. 增長新的具體工廠和產品族方便,切換產品族方便

缺點

不易增長新的產品,若是要增長新的產品須要抽象工廠和全部具體工廠

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);
    }

}
複製代碼
具體產品

共四款遊戲產品:NintendoShootGameNintendoTowerDefenceGameTencentShootGameTencentTowerDefenceGame

/** * @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…

相關閱讀

建立型設計模式

關注於如何建立對象

  1. 23種設計模式之單例模式

    保證在程序運行期間一個類只有一個實例,並提供一個全局訪問點

  2. 23種設計模式之工廠模式

    用工廠方法代替new操做,讓子類去決定實例化哪一個類,工廠方法將一個類的實例化延遲到子類

  3. 23種設計模式之抽象工廠

    抽象工廠模式屬於建立型模式,是對工廠方法模式的擴展,抽象工廠比工廠模式更爲抽象,工廠方法模式針對產品等級結構,而抽象工廠針對產品族

  4. 23種設計模式之建造者模式

    經過克隆一個已經存在的對象實例來返回新的實例,而不是經過new去建立對象

  5. 23種設計模式之原型模式

    經過克隆一個已經存在的對象實例來返回新的實例,而不是經過new去建立對象

結構型設計模式

關注於類和對象之間的關係

  1. 23種設計模式之適配器模式

    組合兩個不相干類,在兩個不兼容的接口之間提供一個混合接口,使其兼容適配

  2. 23種設計模式之橋接模式

    將抽象部分與它的實現部分分離,使它們均可以獨立地變化。橋接模式將系統各維度抽象出來,各維度獨立變化,以後可經過聚合,將各維度組合起來,減小它們之間耦合

  3. 23種設計模式之組合模式

    用來描述部分與總體的關係,是用於把一組類似的對象看成一個單一的對象。組合模式依據樹形結構來組合對象,因此組合模式的使用場景就是出現樹形結構的地方。

  4. 23種設計模式之裝飾器模式

    裝飾器模式能夠爲一個現有的類增長新功能,又不改變其結構,要求裝飾類和被裝飾類實現同一個接口,裝飾類持有被裝飾類的實例

  5. 23種設計模式以外觀模式

    外觀模式是爲了解決類與類之家的責任關係和依賴關係的,經過提供一個Facade類來隱藏這些複雜的類之間關係的調用,並提供一個接口,供外部調用,利用這種方式進行類之間的解耦

  6. 23種設計模式之代理模式

    代理模式就是在操做原對象的時候,多出來一個代理類,用來對原對象的訪問進行控制和替代原對象進行一些操做

  7. 23種設計模式之代理享元模式

    運用共享技術有效地支持大量細粒度對象的複用,主要用來減小對象的建立,用來減小內存和提升性能,比較常見的鏈接池,緩衝池這類的池技術都是享元模式

行爲型設計模式

關注於對象之間的通訊

  1. 23種設計模式之模板方法模式

    在父類(抽象類)中定義好算法的流程,提供抽象方法,針對不一樣的實現交由不一樣的子類去實現,經過這種方式將公共代碼提取出來封裝在父類中,而後父類去控制行爲,子類負責實現

  2. 23種設計模式之策略模式

    在系統中提供一組策略,並將每一個策略封裝成類,使他們能夠相互轉換,具體策略的選擇由客戶端決定

  3. 23種設計模式之觀察者模式

    定義對象間一種一對多的依賴關係,使得每當一個對象改變狀態,則全部依賴於它的對象都會獲得通知並被自動更新

  4. 23種設計模式之迭代器模式

    迭代器模式就是爲解決遍歷元素而誕生的,它提供一種方法訪問一個容器對象中各個元素,而又不需暴露該對象的內部細節

  5. 23種設計模式之責任鏈模式

    使多個對象都有機會處理請求,從而避免了請求的發送者和接受者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有對象處理它爲止

  6. 23種設計模式之命令模式

    將一個請求封裝成一個對象,從而讓你使用不一樣的請求把客戶端參數化,對請求排隊或者記錄請求日誌,能夠提供命令的撤銷和恢復功能,用來下降類之間解耦

  7. 23種設計模式之備忘錄模式

    在不破壞封裝性的前提下,捕獲一個對象的內部狀態,並在該對象以外保存這個狀態。這樣之後就可將該對象恢復到原先保存的狀態,其實就是在某個時刻備份了對象的狀態,在更改對象狀態後,能夠經過備份將對象還原成備份時刻的狀態

  8. 23種設計模式之狀態模式

    容許一個對象在其內部狀態改變時改變它的行爲,對象看起來彷佛修改了它的類,對象的行爲依賴於它的狀態(屬性),而且能夠根據它的狀態改變而改變它的相關行爲

  9. 23種設計模式之訪問者模式

    封裝一些做用於某種數據結構中的各元素的操做,它能夠在不改變數據結構的前提下定義做用於這些元素的新的操做,訪問者模式就是將數據結構與數據操做相分離

  10. 23種設計模式之中介者模式

    用一箇中介對象來封裝一系列的對象交互,中介者使各對象不須要顯式地相互引用,從而使其耦合鬆散,並且能夠獨立地改變它們之間的交互

  11. 23種設計模式之解釋器模式

    給定一門語言,定義它的文法的一種表示,並定義一個解釋器,該解釋器使用該表示來解釋語言中的句子

相關文章
相關標籤/搜索