设计模式笔记-创建型模式之三--工厂方法:Factory Method

适用性:

1当一个类不知道它所必须创建的对象的类的时候

2当一个类希望它的子类来指定所创建对象的时候

3当类将创建对象的职责委托给多个帮助子类中的一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候

 

效果:

1不再将与特定应用有关的类邦定到代码中。

2为子类提供挂钩(hook 用工厂方法在一个类的内部创建对象通常比直接创建对象更灵活。Factory Method给子类一个挂钩以提供对象的扩展版本

3连接平行的类层次

 

实现:

1两种不同情况  1Creator是抽象类并且不提供它所声明的工厂方法的实现

                             2Creator是一个具体的类而且为工厂方法提供一个缺省的实现

2 参数化工厂方法 工厂方法采用一个标识要被创建的对象种类的参数

3C++中的工厂方法都是虚函数并且常常是纯虚函数

4使用模板以避免创建子类

 

抽象工厂与工厂方法的区别:

 工厂方法模式:一个抽象产品类,可以派生出多个具体产品类。  
                             
一个抽象工厂类,可以派生出多个具体工厂类。  
                             
每个具体工厂类只能创建一个具体产品类的实例。  
 
抽象工厂模式:多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。  
                             
一个抽象工厂类,可以派生出多个具体工厂类。  
                             
每个具体工厂类可以创建多个具体产品类的实例。  
   
 
区别:工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。  
             
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

示例代码如下:

Factory.h

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

Factory.cpp

  1. #include <iostream>
  2. using namespace std;
  3. #include "Factory.h"
  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.  roomNumber = roomNo;
  14. }
  15. EnchantedRoom::EnchantedRoom(int roomNo):Room(roomNo)
  16. {
  17.  cout<<"Make"<<roomNo<<"Enchanted room"<<endl;
  18.  //roomNumber = roomNo;
  19. }
  20. void Room::SetSide(Direction dire,Mapsite* map)
  21. {
  22.  cout<<"Build a Wall on Direction "<<Direstr[dire]<<endl;
  23. }
  24. void Room::Enter()
  25. {
  26.  cout<<"Room enter"<<endl;
  27. }
  28. Wall::Wall()
  29. {
  30.  cout<<"Make a wall"<<endl;
  31. }
  32. void Wall::Enter()
  33. {
  34.  cout<<"Wall enter"<<endl;
  35. }
  36. void Door::Enter()
  37. {
  38.  cout<<"Door enter"<<endl;
  39. }
  40. void Maze::AddRoom(Room *r)
  41. {
  42.  cout<<"Add room to the maze!"<<endl;
  43.  a[r->GetRoomNo()]=r;
  44. }
  45. Room* Maze::RoomNo(int roomNO) const
  46. {
  47.  for (int i=0;i<MAX_ROOM_NO;i++)
  48.  { if (i == roomNO)
  49.    if (!a[i])
  50.     return a[i];
  51.    else
  52.     return 0;
  53.  }
  54.  return 0;
  55. }
  56. Door::Door(Room* r1,Room* r2)
  57. {
  58.  cout<<"A door is installed between 2 rooms"<<endl;
  59. }
  60. EnchantedDoor::EnchantedDoor(Room* r1,Room* r2)
  61. {
  62.  cout<<"A Enchanted door is installed between 2 Enchanted Rooms"<<endl;
  63. }
  64. Maze* MazeGame::CreateMaze()
  65. {
  66.     Maze* aMaze = MakeMaze();
  67.     Room* r1 = MakeRoom(1);
  68.     Room* r2 = MakeRoom(2);
  69.     Door* theDoor = MakeDoor(r1,r2);
  70.     aMaze->AddRoom(r1);
  71.     aMaze->AddRoom(r2);
  72.     r1->SetSide(North,MakeWall());
  73.     r1->SetSide(East,theDoor);
  74.     r1->SetSide(South,MakeWall());
  75.     r1->SetSide(West,MakeWall());
  76.     r2->SetSide(North,MakeWall());
  77.     r2->SetSide(East,MakeWall());
  78.     r2->SetSide(South,MakeWall());
  79.     r2->SetSide(West,theDoor);
  80.     return aMaze;
  81. }
  82. EnchantedMazeGame::EnchantedMazeGame()
  83. {
  84.     cout<<"An enchantedMazegame is created!"<<endl;
  85. }

main.cpp

  1. #include <iostream>
  2. using namespace std;
  3. #include "Factory.h"
  4. int main()
  5. {
  6.     MazeGame a;
  7.     EnchantedMazeGame b;
  8.     cout<<"Start MazeGame"<<endl;
  9.     a.CreateMaze();
  10.     cout<<"Start EnchantedMazeGame"<<endl;
  11.     b.CreateMaze();
  12.     return 0;
  13. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值