2013-12-09 86 views
0

我有一個程序是一項家庭作業。首先我們做了一個飛行模擬,在這裏我們分析了xml文件來加載飛機,城市和航班。所有的飛機都有巡航速度,巡航高度等。每個航班都有一個開始時間。我們創建了一個計時器功能,並跟蹤時間以瞭解何時起飛和着陸飛機。在C++中努力實現抽象工廠模式

現在,教官要求我們實施創建飛機的抽象工廠模式,並且我通常理解它是如何工作的......但我似乎無法實現它。

另外,教官告訴我們要將工廠實施爲單身人士。

我不明白的是:

  1. 我會在哪裏實例化的工廠?我有一個裝載程序,它將xml中的數據加載到容器類中。我假設我想一次創建一個工廠,然後從xml中獲得所有這種類型的飛機......併爲所有工廠做這件事。

  2. 由於在平面的不同「類型」中確實沒有區別,除了直接創建對象之外,還有什麼類型的方法接口?

下面是一些示例代碼:一個XML飛機

<PLANE> 
     <MAKE> 
      Gulfstream 150 
     </MAKE> 
     <TYPE> 
      BUSINESSJET 
     </TYPE> 
     <DESCRIPTION> 
      Business Jet 
     </DESCRIPTION> 
     <RATEOFCLIMB> 
      1500 
     </RATEOFCLIMB> 
     <WINGSPAN> 
      55 
     </WINGSPAN> 
     <LENGTH> 
      56 
     </LENGTH> 
     <CRUISESPEED> 
      528 
     </CRUISESPEED> 
     <CRUISEALTITUDE> 
      41000 
     </CRUISEALTITUDE> 
    </PLANE> 

實施例以用於類型

enum AircraftType {NOTYPE, PASSENGERJET, BUSINESSJET, SINGLEENGINE};

飛機類的枚舉:

class Aircraft 
{ 
private: 
    char make[32]; 
    char model[32]; 
    double cruiseSpeed; 
    double cruiseAltitude; 
    double climbRate; 
    double wingspan; 
    double fuselageLength; 

public: 

    Aircraft(void); 
    Aircraft(AircraftFactory*); 
    ~Aircraft(void);  
}; 

抽象工廠類

class AircraftFactory 
{ 

public: 
    AircraftFactory(); 
    ~AircraftFactory(); 
}; 

兩個子類例如

class BusinessJetFactory: public AircraftFactory 
{ 
private: 
    BusinessJetFactory(); 

public: 
    ~BusinessJetFactory(); 
    static BusinessJetFactory* getInstance(); 
}; 

class PassengerJetFactory: public AircraftFactory 
{ 

private: 
    PassengerJetFactory(); 

public: 
    ~PassengerJetFactory(); 
    static PassengerJetFactory* getInstance(); 
}; 

回答

1

通常一個工廠使用,因爲你有一個地圖,可以串之間的匹配(控股類型名稱或類型ID ) - 這是您在數據源中找到的字符串 - 和C++類型。在工廠的初始化時刻,您可以在main函數中對此進行硬編碼。您使用一個「抽象」基本工廠類,以及一個從基本工廠派生的模板工廠。全局(單例)容器只是工廠映射(將字符串綁定到工廠),這就是硬編碼很重要的地方,您將實例化(C++術語「從模板實現具體類」)每種必需類型的工廠。一個工廠具有make函數,該函數僅返回T*(具有T工廠的模板類型,以及它可以創建的對象的類型)。所有這些工廠都存儲在地圖中,然後被稱爲多態容器。 make函數是虛擬的,map只包含指向基本工廠的指針,但由於當你調用auto newobject = factorymap["passenger"]->make()時,那裏包含的實際對象都知道它的真實函數(通過虛擬表),所以你得到了一個你指定的類型的新實例在工廠的硬編碼初始化中,位於該元素的映射的「值」(key_value的一側)中。

現在練習似乎不適合這個,因爲像你說的那樣,只有一種類型的飛機,所以你不需要任何工廠。除非你的xml擁有飛機之外的其他東西,比如機場,乘客,跑道,控制塔,航空公司......

+0

xml擁有航班和城市。所以在之前的程序中。我創建了3個矢量容器。一個用於飛機,城市和航班。這些航班擁有關於何時起飛的信息以及將航班連接到哪個飛機/起飛/目的地。但我仍然不明白爲什麼抽象工廠在這裏很好。 – user2079828

+1

@ user2079828:哦,是的,這很好。因爲你有飛機,城市和航班。完美的案例。您需要爲每種類型實例化一個工廠。但不像你在你的問題中所做的那樣,沒有專門的公務機和passenjer飛機工廠。只有一架飛機,一架飛往城市,一架飛機。這使得1個抽象工廠類和3個具體工廠在init函數中「創建」(通過模板實例化)。 –

+0

你在說什麼不符合我的要求。這裏是指令: 飛機的創建必須按照抽象工廠設計模式按照AircraftFactory類的子類進行分離和處理。 AircraftFactory將有三個子類,分別用於創建客機,公務機和單引擎飛機。工廠將創建適當類型的飛機,爲其創建的飛機類型的所有參數設置適當的值。每個工廠都會返回指向Aircraft對象的指針。 – user2079828