工厂模式(C++)

来源:互联网 发布:东华理工大学软件学院 编辑:程序博客网 时间:2024/03/29 12:38

http://www.cnblogs.com/cxjchen/p/3143633.html

http://www.cnblogs.com/jiese/p/3154669.html
http://blog.csdn.net/wuzhekai1985/article/details/6660462
http://www.cnblogs.com/onlycxue/p/3428075.html

下面就来看代码。首先,要看一下没有进行过优化的代码,这个代码是打算建立一个迷宫(Maze),迷宫的元素是墙、房间、门。它们都是MapSite的子类。同时一个房间有四个方向,有可能是墙也有可能是门。


#include <iostream>  using namespace std;  enum Direction {   North,   East,   South,   West, };  class MapSite { public:   virtual void Enter() = 0; };  class Room : public MapSite { public:   Room(int roomNo):_roomNumber(roomNo) {};      MapSite *GetSide(Direction) const;    virtual void SetSide(Direction direction, MapSite *) {     cout << "Set the "          << _roomNumber          << " room "          << direction          << " side."          << endl;   };    int GetRoomNo() {     return _roomNumber;   };    virtual void Enter() {     cout << "Enter the Room." << endl;   };    private:   MapSite *_sides[4];   int _roomNumber; };  class Wall : public MapSite { public:   Wall() {};    virtual void Enter() {     cout << "Enter the wall." << endl;   };  };  class Door : public MapSite { public:   Door(Room* = 0, Room* = 0) {};      virtual void Enter() {     cout << "Enter the door." << endl;   };   Room *OtherSideFrom(Room*) {};  private:   Room *_room1;   Room *_room2;   bool _isOpen; };  class Maze { public:   Maze() {};    void AddRoom(Room* room) {     cout << "Add the room" << room->GetRoomNo() << "." << endl;   };   Room* RoomNo(int) const{}; };   class MazeGame { public:   Maze *CreateMaze(); };  Maze* MazeGame::CreateMaze() {   Maze* aMaze = new Maze;   Room* r1 = new Room(1);   Room* r2 = new Room(2);   Door* theDoor = new Door(r1, r2);      aMaze->AddRoom(r1);   aMaze->AddRoom(r2);      r1->SetSide(North, new Wall);   r1->SetSide(East, theDoor);   r1->SetSide(South, new Wall);   r1->SetSide(West, new Wall);      r2->SetSide(North, new Wall);   r2->SetSide(East, new Wall);   r2->SetSide(South, new Wall);   r2->SetSide(West, theDoor);      return aMaze; }  int main() {   MazeGame mygame;   mygame.CreateMaze();   return 0; }这个源码就是普通的实现方式。按照工厂模式进行修改之后的代码如下:#include <iostream>  using namespace std;  enum Direction {   North,   East,   South,   West, };  class MapSite { public:   virtual void Enter() = 0; };  class Room : public MapSite { public:   Room(int roomNo):_roomNumber(roomNo) {};      MapSite *GetSide(Direction) const;    virtual void SetSide(Direction direction, MapSite *) {     cout << "Set the "          << _roomNumber          << " room "          << direction          << " side."          << endl;   };    int GetRoomNo() {     return _roomNumber;   };    virtual void Enter() {     cout << "Enter the Room." << endl;   };    private:   MapSite *_sides[4];   int _roomNumber; };  class Wall : public MapSite { public:   Wall() {};    virtual void Enter() {     cout << "Enter the wall." << endl;   };  };  class Door : public MapSite { public:   Door(Room* = 0, Room* = 0) {};      virtual void Enter() {     cout << "Enter the door." << endl;   };   Room *OtherSideFrom(Room*) {};  private:   Room *_room1;   Room *_room2;   bool _isOpen; };  class Maze { public:   Maze() {};    void AddRoom(Room* room) {     cout << "Add the room" << room->GetRoomNo() << "." << endl;   };   Room* RoomNo(int) const{}; };  class MazeFactory { public:   MazeFactory() {};    virtual Maze* MakeMaze() const {     return new Maze;   };    virtual Wall* MakeWall() const {     return new Wall;   };    virtual Room* MakeRoom(int n) const {     return new Room(n);   };    virtual Door* MakeDoor(Room* r1, Room* r2) const {     return new Door(r1, r2);   }; };  class MazeGame { public: Maze* CreateMaze(MazeFactory &factory) {   Maze* aMaze = factory.MakeMaze();   Room* r1 = factory.MakeRoom(1);   Room* r2 = factory.MakeRoom(2);   Door* theDoor = factory.MakeDoor(r1, r2);      aMaze->AddRoom(r1);   aMaze->AddRoom(r2);      r1->SetSide(North, factory.MakeWall());   r1->SetSide(East, theDoor);   r1->SetSide(South, factory.MakeWall());   r1->SetSide(West, factory.MakeWall());      r2->SetSide(North, factory.MakeWall());   r2->SetSide(East, factory.MakeWall());   r2->SetSide(South, factory.MakeWall());   r2->SetSide(West, theDoor);      return aMaze; }; };  int main() {   MazeGame mygame;   MazeFactory factory;   mygame.CreateMaze(factory);   return 0; }对比这两个源码就会发现,实现的功能是完全相同的,只不过第二种实现采用了工厂模式。设计模式既然好,肯定有它的好处,那我们接下来看看,如果是对这个程序进行扩展,要修改迷宫为房间里可以有炸弹的迷宫的时候,我们在采用了工厂模式之后,需要进行哪些修改。#include <iostream>using namespace std;enum Direction {  North,  East,  South,  West,};class MapSite {public:  virtual void Enter() = 0;};class Room : public MapSite {public:  Room(int roomNo):_roomNumber(roomNo) {};    MapSite *GetSide(Direction) const;  virtual void SetSide(Direction direction, MapSite *) {    cout << "Set the "         << _roomNumber         << " room "         << direction         << " side."         << endl;  };  int GetRoomNo() {    return _roomNumber;  };  virtual void Enter() {    cout << "Enter the Room." << endl;  };  private:  MapSite *_sides[4];  int _roomNumber;};class BombRoom : public Room {public:  BombRoom(int num):Room(num) {    _roomNum = num;  };  virtual void SetSide(Direction direction, MapSite *) {    cout << "Set the "         << _roomNum         << " bomb room "         << direction         << " side."         << endl;  };private:  int _roomNum;};class Wall : public MapSite {public:  Wall() {};  virtual void Enter() {    cout << "Enter the wall." << endl;  };};class Door : public MapSite {public:  Door(Room* = 0, Room* = 0) {};    virtual void Enter() {    cout << "Enter the door." << endl;  };  Room *OtherSideFrom(Room*) {};private:  Room *_room1;  Room *_room2;  bool _isOpen;};class Maze {public:  Maze() {};  void AddRoom(Room* room) {    cout << "Add the room" << room->GetRoomNo() << "." << endl;  };  Room* RoomNo(int) const{};};class MazeFactory {public:  MazeFactory() {};  virtual Maze* MakeMaze() const {    return new Maze;  };  virtual Wall* MakeWall() const {    return new Wall;  };  virtual Room* MakeRoom(int n) const {    return new Room(n);  };  virtual Door* MakeDoor(Room* r1, Room* r2) const {    return new Door(r1, r2);  };};class BombMazeFactory : public MazeFactory {public:  virtual Room* MakeRoom(int n) const {    return new BombRoom(n);  };};class MazeGame {public:Maze* CreateMaze(MazeFactory &factory) {  Maze* aMaze = factory.MakeMaze();  Room* r1 = factory.MakeRoom(1);  Room* r2 = factory.MakeRoom(2);  Door* theDoor = factory.MakeDoor(r1, r2);    aMaze->AddRoom(r1);  aMaze->AddRoom(r2);    r1->SetSide(North, factory.MakeWall());  r1->SetSide(East, theDoor);  r1->SetSide(South, factory.MakeWall());  r1->SetSide(West, factory.MakeWall());    r2->SetSide(North, factory.MakeWall());  r2->SetSide(East, factory.MakeWall());  r2->SetSide(South, factory.MakeWall());  r2->SetSide(West, theDoor);    return aMaze;};};int main() {  MazeGame mygame;//  MazeFactory factory;  BombMazeFactory factory;  mygame.CreateMaze(factory);  return 0;}可以看出改动量很小,而且可以随时把代码改回原来的生成普通迷宫的情况。


0 0
原创粉丝点击