首先啰嗦下建立迷宫所用的Room类。这个类并不直接保存Room四周的构造,而是经过MapSite* _sides[4]这个私有数组成员指向Room四周的构造。那么何时将四周构造直接放在Room中,何时经过指针访问,这两种方式各有神马优缺点?这是个问题[2015.10.07:你没法预先肯定四周构造的具体类型,因此没办法将其直接放在Room中,只能使用基类指针]……不过这不是Abstract Fractory的重点,先放一边吧。ios
就“Factory”这个词的本义来讲,上面这张图自己就够抽象的。让咱们用更贴近“Factory”一词的汽车厂来做例子。数组
在遥远的北方大陆上有两家汽车厂,一家是BMW,一家是Benz。他们生产的汽车只有两个部件:方向盘和轮子(别问我这样的汽车怎么开)。因而咱们的Abstract Factory有两个Virtual方法:CreateSteering,CreateWheel。天然,BMWFactory和BenzFactory各自造出的轮子和方向盘是有区别的。ide
另外一方面,无论BMW的轮子仍是Benz的轮子,都是圆的,能在地上滚动的;方向盘一样有其共同点。因此咱们有AbstractSteering和AbstractWheel以及它们的派生类。函数
综上,“工厂”有“抽象工厂”和具体的“实际工厂”;spa
“工厂产品”有“抽象产品”和具体的“实际产品”。3d
“工厂类”和其生产产品的“产品类”是分开的,但各个工厂生产的产品种类是同样的,这样才能在Factory Class和Product Class之间创建对应关系。指针
下面是代码:code
1 // 编译环境:VS2008 2 // AbstractFactory.cpp : 定义控制台应用程序的入口点。 3 // 4 5 #include "stdafx.h" 6 #include <iostream> 7 8 using namespace std; 9 10 class AbstractWheel 11 { 12 public: 13 14 }; 15 16 class BenzWheel : public AbstractWheel 17 { 18 public: 19 BenzWheel() 20 { 21 cout << "I am BenzWheel" << endl; 22 } 23 }; 24 25 class BMWWheel : public AbstractWheel 26 { 27 public: 28 BMWWheel() 29 { 30 cout << "I am BMWWheel" << endl; 31 } 32 }; 33 34 class AbstractSteering 35 { 36 public: 37 38 }; 39 40 class BenzSteering 41 { 42 public: 43 BenzSteering() 44 { 45 cout << "I am BenzSteering" << endl; 46 } 47 }; 48 49 class BMWSteering 50 { 51 public: 52 BMWSteering() 53 { 54 cout << "I am BMWSteering" << endl; 55 } 56 }; 57 58 class AbstractFactory 59 { 60 public: 61 virtual void CreateWheel(); // No implement in virtual base class 62 virtual void CreateSteering(); // No implement in virtual base class 63 }; 64 65 class BenzFactory 66 { 67 public: 68 virtual void CreateWheel() 69 { 70 new BenzWheel(); 71 } 72 virtual void CreateSteering() 73 { 74 new BenzSteering(); 75 } 76 }; 77 78 class BMWFactory 79 { 80 public: 81 virtual void CreateWheel() 82 { 83 new BMWWheel(); 84 } 85 virtual void CreateSteering() 86 { 87 new BMWSteering(); 88 } 89 }; 90 91 void CreateCar(AbstractFactory& factory) 92 { 93 factory.CreateSteering(); 94 factory.CreateWheel(); 95 } 96 97 int _tmain(int argc, _TCHAR* argv[]) 98 { 99 // I want a BMW car 100 BMWFactory factory; 101 CreateCar((AbstractFactory&)factory); 102 // I want a Benz car 103 //BenzFactory factory; 104 //CreateCar((AbstractFactory&)factory); 105 return 0; 106 }
若是你想要一辆Benz car,将main()中的注释代码放开就能够了。blog
顺便说一下,上面代码中,CreateCar并非Factory类的成员函数;这貌似不符合现实世界汽车厂的一向作法。不过咱们的代码例子主要为了演示Abstract Factory模式,而这种模式主要关心的是“产品部件生产”的抽象,而不关心“产品组装”的抽象,因此代码和现实的这点区别就忽略吧。或者想想书中不一样风格窗口的那个例子:不一样风格窗口的组装是应用程序的事情,而不是Widget类库的事情。get