设计模式初学者笔记:Abstract Factory模式

      首先啰嗦下建立迷宫所用的Room类。这个类并不直接保存Room四周的构造,而是经过MapSite* _sides[4]这个私有数组成员指向Room四周的构造。那么何时将四周构造直接放在Room中,何时经过指针访问,这两种方式各有神马优缺点?这是个问题[2015.10.07:你没法预先肯定四周构造的具体类型,因此没办法将其直接放在Room中,只能使用基类指针]……不过这不是Abstract Fractory的重点,先放一边吧。ios

image

      就“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

相关文章
相关标签/搜索