设计模式笔记--创建型模式之一 抽象工厂

来源:互联网 发布:淘宝 在异地 被起诉 编辑:程序博客网 时间:2024/05/22 02:23

抽象工厂模式:Abstract Factory

适用性:

1一个系统要独立于它的产品的创建,组合和表示时

2一个系统要由多个产品系列中的一个来配置时

3强调一系列相关的产品对象的设计以便进行联合使用时

4提供一个产品类库,而只想显示他们的接口而不是实现时

 

效果

1分离了具体的类,工厂封装创建产品对象的责任和过程,将客户与类的实现分离。

2使得易于交换产品系列,一个具体工厂类只出现一次。只需改变具体的工厂即可以使用不同的产品配置

3有利于产品的一致性

4难以支持新种类中的产品,Abstract Factory接口确定了可以被创建的产品集合

 

实现:

1将工厂作为单件,工厂通常最好实现为一个Singleton

2创建产品 为每个产品定义一个具体的工厂方法

3定义可扩展的工厂 更灵活但不安全的方法是给创建对象的操作增加一个参数,来制定创建对象的种类

 

以下是根据书本practice的代码实现。

Mapsite.h

 

 

 

  1. #include <string>
  2. enum Direction {North,South,East,West,Length};
  3. class Mapsite
  4. {
  5. public:
  6.   Mapsite(){}
  7.   virtual ~Mapsite(){}
  8.   virtual void Enter() = 0;
  9. };
  10. class Room : public Mapsite
  11. {
  12. public:
  13.   Room(int roomNo);
  14.   Mapsite* GetSide(Direction) const;
  15.   void SetSide(Direction,Mapsite*);
  16.   virtual void Enter();
  17. private:
  18.   Mapsite* _sides[4];
  19.   int roomNumber;
  20. };
  21. class EnchantedRoom: public Room
  22. {
  23. public:
  24.     EnchantedRoom(int roomNo);
  25. };
  26. class Wall:public Mapsite
  27. {
  28. public:
  29.     Wall();
  30.     virtual void Enter();
  31. };
  32. class Door:public Mapsite
  33. {
  34. public:
  35.   Door(Room* = 0,Room* = 0);
  36.   virtual void Enter();
  37.   Room * OtherSideFrom(Room*);
  38. private:
  39.   Room* _room1;
  40.   Room* _room2;
  41.   bool _isOpen;
  42. };
  43. class EnchantedDoor:public Door
  44. {
  45.  public:
  46.  EnchantedDoor(EnchantedRoom* =0,EnchantedRoom* =0);
  47. };
  48. class Maze {
  49. public:
  50.     //Maze();
  51.     void AddRoom(Room *);
  52.     Room* RoomNo(intconst;
  53. };
  54. class MazeFactory  //Abstract Factory
  55. {
  56. public:
  57.     //MazeFactory();
  58.     virtual Maze*  MakeMaze() const
  59.     {return new Maze;}
  60.     virtual Wall*  MakeWall() const
  61.     {return new Wall;}
  62.     virtual Room*  MakeRoom(int n )const
  63.     {return new Room(n);}
  64.     virtual Door* MakeDoor(Room* r1,Room* r2) const
  65.     {return new Door(r1,r2);}
  66. };
  67. class EnchantedMazeFactory:public MazeFactory
  68. {
  69. public:
  70.     EnchantedMazeFactory();
  71.     virtual Room*  MakeRoom(int n ) const
  72.     {return new EnchantedRoom(n);}
  73.     virtual Door* MakeDoor(EnchantedRoom* r1,EnchantedRoom* r2) const
  74.     {return new EnchantedDoor(r1,r2);}
  75. };
  76. class MazeGame
  77. {
  78. public:
  79.     Maze* CreateMaze(MazeFactory& factory);
  80. };

MapSite.cpp

 

 

  1. #include "MapSite.h"
  2. #include <iostream>
  3. using namespace std;
  4. string Direstr[Length] ={
  5.     "North",
  6.     "South",
  7.     "East",
  8.     "West"
  9. };
  10. Room::Room(int roomNo)
  11. {
  12.  cout<<"Make "<<roomNo<<" room"<<endl;
  13. }
  14. EnchantedRoom::EnchantedRoom(int roomNo):Room(roomNo)
  15. {
  16.  cout<<"Make "<<roomNo<<" enchantedroom"<<endl;
  17. }
  18. void Room::SetSide(Direction dire,Mapsite* map)
  19. {
  20.  cout<<"Build a Wall on Direction "<<Direstr[dire]<<endl;
  21. }
  22. void Room::Enter()
  23. {
  24.  cout<<"Room enter"<<endl;
  25. }
  26. Wall::Wall()
  27. {
  28.  cout<<"Make a wall"<<endl;
  29. }
  30. void Wall::Enter()
  31. {
  32.  cout<<"Wall enter"<<endl;
  33. }
  34. void Door::Enter()
  35. {
  36.  cout<<"Door enter"<<endl;
  37. }
  38. void Maze::AddRoom(Room *r)
  39. {
  40.  cout<<"Add room to the maze!"<<endl;
  41. }
  42. Door::Door(Room* r1,Room* r2)
  43. {
  44.  cout<<"A door is installed between 2 rooms"<<endl;
  45. }
  46. EnchantedDoor::EnchantedDoor(EnchantedRoom* r1,EnchantedRoom* r2)
  47. {
  48.  cout<<"A enchanteddoor is installed between 2 enchantedrooms"<<endl;
  49. }
  50. EnchantedMazeFactory::EnchantedMazeFactory()
  51. {
  52.  cout<<"A enchantedMazeFactory is created"<<endl;
  53. }
  54. Maze* MazeGame::CreateMaze(MazeFactory& factory)
  55. {
  56.     Maze* aMaze = factory.MakeMaze();
  57.     Room* r1 =factory.MakeRoom(1);
  58.     Room* r2 =factory.MakeRoom(2);
  59.     //Door* aDoor = factory.MakeDoor(r1,r2);
  60.     aMaze->AddRoom(r1);
  61.     aMaze->AddRoom(r2);
  62.     r1->SetSide(North,factory.MakeWall());
  63.     r2->SetSide(East, factory.MakeWall());
  64.     return aMaze;
  65. }

 

main.cpp

 

 

  1. #include "MapSite.h"
  2. #include <iostream>
  3. using namespace std;
  4. //´«µÝÒ»¸ö¶ÔÏó¸øCreateMaze×÷²ÎÊýÀ´´´½¨·¿¼ä£¬Ç½±ÚºÍÃÅ£¬¾Í´«µÝ²»Í¬µÄ¹¤³§²ÎÊýÀ´¸Ä±ä·¿¼äǽ±ÚºÍÃŵÄÀà
  5. //¾ÍÊdzéÏ󹤳§µÄÒ»¸öÀý×Ó
  6. int main()
  7. { MazeGame a;
  8.  MazeFactory b;
  9.  EnchantedMazeFactory c;
  10.  a.CreateMaze(c);
  11.  return 0;
  12. }