我有一个家庭作业的程序。首先我们进行了飞行模拟,我们解析了xml文件以加载飞机,城市和航班。所有的飞机都有巡航速度,巡航高度等等。每次飞行都有一个开始时间。我们创建了一个计时器功能,并跟踪时间,以确定何时使飞机起飞和降落。
现在,教练要求我们实施抽象工厂模式来创建飞机,我一般都了解它是如何工作的......但我似乎无法实现它。
此外,教练告诉我们将工厂作为单身人士实施。
我不明白的是:
我会在哪里实例化工厂?我有一个加载器,可以将数据从xml加载到容器类。我假设我想一次创建一个工厂,然后从xml中获得所有类型的飞机......并为所有工厂做到这一点。
因为不同的' TYPES'对于飞机来说,除了直接创建对象之外,我还能做出什么样的方法界面呢?
以下是一些示例代码:
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();
};
答案 0 :(得分:1)
通常使用工厂是因为您有一个可以匹配字符串(保存类型名称或类型ID)的映射(它是您在数据源中找到的字符串)和C ++类型。您在工厂的初始化时刻在主函数中对此对应进行硬编码。您使用一个“抽象”基础工厂类,以及一个从基础工厂派生的模板工厂。全局(单例)容器,只是工厂的映射(将字符串绑定到工厂),这是硬编码的重要部分,您将实例化(C ++术语“从模板中实现具体类”)每个必要类型的工厂。一个工厂有一个make
函数,只返回T*
(T
工厂的模板类型,巧合的是它可以创建的对象类型)。所有这些工厂都存储在地图中,然后称为多态容器。 make函数是虚拟的,map只包含指向基础工厂的指针,但由于当你调用make
时,每个包含的实际对象都知道它的真实auto newobject = factorymap["passenger"]->make()
函数(通过虚拟表)您在工厂的硬编码初始化中指定的类型的新实例,该实例位于此元素的映射的“value”(key_value的一侧)中。
现在看起来不太合适了,因为就像你说的那样,只有一种类型的飞机,所以你不需要任何工厂。除非您的xml拥有除飞机之外的其他东西,例如机场,乘客,跑道,控制塔,航空公司...