设计模式学习笔记(三)——Factory Method工厂方法

    技术2022-05-11  78

    三、Factory Method(工厂方法)

    情景举例:

    创建一个可重用的建造迷宫程序。

    代码示例:

    class MazeGame { public:     Maze* CreateMaze(); /* */ // 以下4个方法为工厂方法: /* */     virtual Maze* MakeMaze() const         { return new Maze; }     virtual Room* MakeRoom(int n) const         { return new Room(n); }     virtual Wall* MakeWall() const         { return new Wall; }     virtual Door* MakeDoor(Room* r1, Room* r2) const         { return new Door(r1, r2); } }; /* 调用自身的方法来创建迷宫 */ Maze* MazeGame::CreateMaze () {     Maze* aMaze = MakeMaze(); /* */     Room* r1 = MakeRoom(1);     Room* r2 = MakeRoom(2);     Door* theDoor = MakeDoor(r1, r2); /* */     aMaze->AddRoom(r1);     aMaze->AddRoom(r2); /* */     r1->SetSide(North, MakeWall());     r1->SetSide(East, theDoor);     r1->SetSide(South, MakeWall());     r1->SetSide(West, MakeWall()); /* */     r2->SetSide(North, MakeWall());     r2->SetSide(East, MakeWall());     r2->SetSide(South, MakeWall());     r2->SetSide(West, theDoor); /* */     return aMaze; } /* 重建一个迷宫只需要继承父类,然后重写需要重定义的工厂方法 */ class BombedMazeGame : public MazeGame { public:     BombedMazeGame(); /* */     virtual Wall* MakeWall() const         { return new BombedWall; } /* */     virtual Room* MakeRoom(int n) const         { return new RoomWithABomb(n); } }; /* */ class EnchantedMazeGame : public MazeGame { public:     EnchantedMazeGame(); /* */     virtual Room* MakeRoom(int n) const         { return new EnchantedRoom(n, CastSpell()); } /* */     virtual Door* MakeDoor(Room* r1, Room* r2) const         { return new DoorNeedingSpell(r1, r2); } protected:     Spell* CastSpell() const; }; /* */

     

    个人理解:

    工厂方法比较简单,只有一个类层次。在父类中定义了工厂方法(可以是纯虚函数来强迫子类定义实现),子类只需要实现这些工厂方法即可。

    注意:最好在父类中使用命名约定来清楚说明你在使用的工厂方法。

     

    最新回复(0)