2013-12-09 55 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