23種設計模式C++實現——抽象工廠模式

   在做面向對象的軟件開發時我們往往想達到更高的代碼可複用性和更合理的軟件顆粒度。
  根據《設計模式——可複用面向對象軟件的基礎》所說:“你必須找到相關的對象,以適當的顆粒度將他們迴歸類,再定義類的接口和繼承層次,建立對象之間的基本關係。你的設計應該對手頭的問題有針對性,同時對將來的問題和需求也要有足夠的通用性。
  內行的設計者知道:不是解決任何問題都要從頭做起。他們更願意複用以前使用的解決方案。這些重複的模式方案解決特定的問題,使得面向對象的設計更靈活、優雅,最終複用性更好。它們幫助設計者將新的設計建立在以往的工作基礎上,複用以往的成功設計方案。一個熟悉這些設計模式的設計者不需要再去發現它們,而能夠立即將他們應用於設計問題中。
  本系列文章主要參考文獻爲——設計模式,可複用面向對象軟件的基礎(Design Patterns Elements of Reusable Object-Oriented SoftWare Erich.),內部代碼基本用C++語言編寫。
    彙總鏈接:23種設計模式C++實現——概要(索引彙總)

摘要

   本章主要說明抽象工廠設計模式,該設計模式相對於簡單工廠模式,工廠方法模式更爲靈活。工廠方法模式和抽象工廠模式都包含抽象產品和抽象工廠,抽象工廠模式的區別在於,其抽象工廠對於對個抽象產品打包生產的特性,去掉該特性即是工廠方法模式。同樣的,工廠方法模式去掉抽象工廠類轉爲實體類則是簡單工廠模式,對於模式的學習可以通過比對的方式讓自己對於類似相近模式有更深的理解。

具體實現代碼

   接下來我們通過一個實例代碼來說明具體實現:
【例圖】

/****************************************************************
 Author :   BingLee
 Date   :   2019-03-13
 Info   :
 https://blog.csdn.net/Bing_Lee (C)All rights reserved.
******************************************************************/
#include <stdio.h>
#include <string>
//抽象引擎配件類
class Engine
{
public:
    virtual void CreatEngine() = 0;
};
//具體引擎配件類
class BMW320Engine : public Engine
{
public:
    BMW320Engine(){this->CreatEngine();}
    void CreatEngine(){printf("creat BMW 320 Engine!\n");}
};
class BMW520Engine : public Engine
{
public:
    BMW520Engine(){this->CreatEngine();}
    void CreatEngine(){printf("creat BMW 520 Engine!\n");}
};
//抽象變速箱配件類
class GearBox
{
public:
    virtual void CreatGearBox() = 0;
};
//具體變速箱配件類
class BMW320GearBox : public GearBox
{
public:
    BMW320GearBox(){this->CreatGearBox();}
    void CreatGearBox(){printf("creat BMW 320 GearBox!\n");}
};

class BMW520GearBox : public GearBox
{
public:
    BMW520GearBox(){this->CreatGearBox();}
    void CreatGearBox(){printf("creat BMW 520 GearBox!\n");}
};
//抽象工廠類
class AbstractFactory
{
public:
    virtual Engine* CreatEngine() = 0;
    virtual GearBox* CreatGearBox() = 0;
};
//具體BMW320工廠類
class BMW320Factory : public AbstractFactory
{
public:
    BMW320Factory(){}
    Engine* CreatEngine(){
        return new BMW320Engine();
    }
    GearBox* CreatGearBox(){
        return new BMW320GearBox();
    }
};
//具體BMW520工廠類
class BMW520Factory : public AbstractFactory
{
public:
    BMW520Factory(){}
    Engine* CreatEngine(){
        return new BMW520Engine();
    }
    GearBox* CreatGearBox(){
        return new BMW520GearBox();
    }
};
//客戶端
#include <QCoreApplication>
#include "simplefactory.h"
#include "abstractfactory.h"
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    AbstractFactory *factory320 = new BMW320Factory();
    AbstractFactory *factory520 = new BMW520Factory();
    //創建BMW320專屬的Engine和Gearbox
    Engine *engine320 = factory320->CreatEngine();
    GearBox *gearbox320 = factory320->CreatGearBox();
    //創建BMW520專屬的Engine和Gearbox
    Engine *engine520 = factory520->CreatEngine();
    GearBox *gearbox520 = factory520->CreatGearBox();
    return a.exec();
}


/*理論輸出
creat BMW 320 Engine!
creat BMW 320 GearBox!
creat BMW 520 Engine!
creat BMW 520 GearBox!
*/

抽象工廠模式補充說明

   其實這博客提到的三種工廠模式都非常的相似,都是爲了實現將具體的產品與構造組合劃分開來;不必爲了追求更多的功能而使用相對難點的抽象工廠模式,最好的方法是根據需求來選用,如果簡單工廠能實現現有需求及未來一段時間則採用這個模式,不能採用則採用其他模式。
  抽象工廠模式關鍵在於對於歸屬於同一產品系列的配件做組合使用,這些配件可能分屬於不用的抽象類,但在抽象工廠模式的具體工廠類中可以將他們做組合,正如BMW320Factory對 BMW320Engine 與 BMW320GearBox的組合實例化,這便是我認爲抽象工廠的精髓。
  
  本篇博客中的代碼均已通過編譯,如有Bug,請提出寶貴意見~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章