天天看點

【C++設計模式】抽象工廠模式

學習總結

(1)抽象工廠模式結構與工廠方法模式結構類似,不同之處在于,一個具體工廠可以生産多種同類相關的産品。

  • 抽象工廠模式的優點:
  • 工廠方法用于建立客戶所需産品,同時向客戶隐藏某個具體産品類将被執行個體化的細節,使用者隻需關心所需産品對應的工廠;
  • 新加入産品系列時,無需修改原有系統,增強了系統的可擴充性,符合開閉原則。
  • 抽象工廠模式的缺點:
  • 在已有産品系列中添加新産品時需要修改抽象層代碼,對原有系統改動較大,違背開閉原則
  • 适用環境:
  • 一系列/一族産品需要被同時使用時,适合使用抽象工廠模式;
  • 産品結構穩定,設計完成之後不會向系統中新增或剔除某個産品
抽象工廠模式中,如果需要新增加一個系列的産品,比如足球系列,隻需增加一族新的具體産品類(抽象和具體)并提供一個對應的工廠類即可。但是,如果要在已有的産品族裡增加另一個産品,比如Jungle打籃球,除了需要籃球和籃球衣外,Jungle還想換雙籃球鞋,這時候該怎麼辦呢?是不是要去修改BasketballFactory呢?

文章目錄

  • ​​學習總結​​
  • ​​一、抽象工廠模式​​
  • ​​1.1 抽象工廠模式結構​​
  • ​​1.2 抽象工廠模式的栗子​​
  • ​​二、AbstractFactory.h頭檔案​​
  • ​​三、用戶端代碼​​

一、抽象工廠模式

抽象工廠模式,其抽象程度更高,每一個具體工廠可以生産一組相關的具體産品對象。

抽象工廠模式的定義:提供一個建立一系列相關或互相依賴對象的接口,而無需指定他們具體的類。

1.1 抽象工廠模式結構

抽象工廠模式結構與工廠方法模式結構類似,不同之處在于,一個具體工廠可以生産多種同類相關的産品:

  • 抽象工廠(AbstractFactory):所有生産具體産品的工廠類的基類,提供工廠類的公共方法;
  • 具體工廠(ConcreteFactory):生産具體的産品
  • 抽象産品(AbstractProduct):所有産品的基類,提供産品類的公共方法
  • 具體産品(ConcreteProduct):具體的産品類
【C++設計模式】抽象工廠模式

結合抽象工廠模式定義和UML,可以看到具體工廠​

​ConcreteFactory_A​

​​可以生産兩種産品,分别是​

​ConcreteProduct_A_1​

​​和​

​ConcreteProduct_A_2​

​​,另一個具體工廠​

​ConcreteFactory_B​

​​同理。用戶端使用時,需要聲明一個抽象工廠​

​AbstractFactory​

​​和兩個抽象産品​

​AbstractProduct​

​。

1.2 抽象工廠模式的栗子

籃球保管室可以提供籃球和籃球衣,足球保管室可以提供足球和足球衣。Jungle隻要根據心情去某個保管室,就可以換上球衣、拿上球,然後就可以愉快地玩耍了。

【C++設計模式】抽象工廠模式

對應的UML執行個體圖:

【C++設計模式】抽象工廠模式

二、AbstractFactory.h頭檔案

//抽象工廠類
class AbstractFactory
{
public:
  virtual AbstractBall *getBall() = 0;
  virtual AbstractShirt *getShirt() = 0;
};      
//抽象産品類AbstractBall
class AbstractBall
{
public:
  AbstractBall(){}
  //抽象方法:
  void play(){};
};

//具體産品類Basketball
class Basketball :public AbstractBall
{
public:
  Basketball(){
    play();
  }
  //具體實作方法
  void play(){
    printf("Jungle play Basketball\n\n");
  }
};
 
//具體産品類Football
class Football :public AbstractBall
{
public:
  Football(){
    play();
  }
  //具體實作方法
  void play(){
    printf("Jungle play Football\n\n");
  }
};

//抽象産品類AbstractShirt
class AbstractShirt
{
public:
  AbstractShirt(){}
  //抽象方法:
  void wearShirt(){};
};

//具體産品類BasketballShirt
class BasketballShirt :public AbstractShirt
{
public:
  BasketballShirt(){
    wearShirt();
  }
  //具體實作方法
  void wearShirt(){
    printf("Jungle wear Basketball Shirt\n\n");
  }
};
 
//具體産品類FootballShirt
class FootballShirt :public AbstractShirt
{
public:
  FootballShirt(){
    wearShirt();
  }
  //具體實作方法
  void wearShirt(){
    printf("Jungle wear Football Shirt\n\n");
  }
};

//抽象工廠類
class AbstractFactory
{
public:
  virtual AbstractBall *getBall() = 0;
  virtual AbstractShirt *getShirt() = 0;
};


//具體工廠類BasketballFactory
class BasketballFactory :public AbstractFactory
{
public:
  BasketballFactory(){
    printf("BasketballFactory\n");
  }
  AbstractBall *getBall(){
    printf("Jungle get basketball\n");
    return new Basketball();
  }
  AbstractShirt *getShirt(){
    printf("Jungle get basketball shirt\n");
    return new BasketballShirt();
  }
};
 
//具體工廠類BasketballFactory
class FootballFactory :public AbstractFactory
{
public:
  FootballFactory(){
    printf("FootballFactory\n");
  }
  AbstractBall *getBall(){
    printf("Jungle get football\n");
    return new Football();
  }
  AbstractShirt *getShirt(){
    printf("Jungle get football shirt\n");
    return new FootballShirt();
  }
};      

三、用戶端代碼

#include <iostream>
#include "AbstractFactory.h"
 
int main()
{
  printf("抽象工廠模式\n");
  
  //定義工廠類對象和産品類對象
  AbstractFactory *fac = NULL;
  AbstractBall *ball = NULL;
  AbstractShirt *shirt = NULL;
  
  fac = new BasketballFactory();
  ball = fac->getBall();
  shirt = fac->getShirt();
 
  fac = new FootballFactory();
  ball = fac->getBall();
  shirt = fac->getShirt();
 
  system("pause");
  return 0;
}      

繼續閱讀