在C ++中实现抽象工厂模式苦苦挣扎

时间:2013-12-09 01:23:08

标签: c++ oop design-patterns

我有一个家庭作业的程序。首先我们进行了飞行模拟,我们解析了xml文件以加载飞机,城市和航班。所有的飞机都有巡航速度,巡航高度等等。每次飞行都有一个开始时间。我们创建了一个计时器功能,并跟踪时间,以确定何时使飞机起飞和降落。

现在,教练要求我们实施抽象工厂模式来创建飞机,我一般都了解它是如何工作的......但我似乎无法实现它。

此外,教练告诉我们将工厂作为单身人士实施。

我不明白的是:

  1. 我会在哪里实例化工厂?我有一个加载器,可以将数据从xml加载到容器类。我假设我想一次创建一个工厂,然后从xml中获得所有类型的飞机......并为所有工厂做到这一点。

  2. 因为不同的' TYPES'对于飞机来说,除了直接创建对象之外,我还能做出什么样的方法界面呢?

  3. 以下是一些示例代码:

    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 个答案:

答案 0 :(得分:1)

通常使用工厂是因为您有一个可以匹配字符串(保存类型名称或类型ID)的映射(它是您在数据源中找到的字符串)和C ++类型。您在工厂的初始化时刻在主函数中对此对应进行硬编码。您使用一个“抽象”基础工厂类,以及一个从基础工厂派生的模板工厂。全局(单例)容器,只是工厂的映射(将字符串绑定到工厂),这是硬编码的重要部分,您将实例化(C ++术语“从模板中实现具体类”)每个必要类型的工厂。一个工厂有一个make函数,只返回T*T工厂的模板类型,巧合的是它可以创建的对象类型)。所有这些工厂都存储在地图中,然后称为多态容器。 make函数是虚拟的,map只包含指向基础工厂的指针,但由于当你调用make时,每个包含的实际对象都知道它的真实auto newobject = factorymap["passenger"]->make()函数(通过虚拟表)您在工厂的硬编码初始化中指定的类型的新实例,该实例位于此元素的映射的“value”(key_value的一侧)中。

现在看起来不太合适了,因为就像你说的那样,只有一种类型的飞机,所以你不需要任何工厂。除非您的xml拥有除飞机之外的其他东西,例如机场,乘客,跑道,控制塔,航空公司...