设计模式笔记--创建型模式之二 Builder

 

将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

适用性:

1当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时

2 当构造过程必须允许被构造的对象有不同的表示时

效果:

1使你可以改变一个产品的内部表示,Builder提供给导向器一个构造产品的抽象接口,该接口可以隐藏这个产品的表示和内部结构。

2它将构造代码与表示代码分开,Builder模式通过封装一个复杂的对象的创建和表示发表过法提高了对象的模块性。每个ConcreteBuilder包含了创建和装配一个产品的所有代码,不同的Director可以复用相同部件集合的基础上构建不同的Product

3对构造过程进行精细控制,是在导向者的控制下一步一步构造产品的,当该产品完成时才从生成器取回。Builder接口更好的反映了产品的构造过程

实现:

1装配和构造接口 Builder接口必须足够普遍以便为各种类型的具体生成器构造产品

2产品没有抽象类

3Builder中缺省方法为空,不生明为纯虚成员函数,而是把它们定义为空方法,允许客户只定义他们所感兴趣的操作。

 

Abstract FactoryBuilder比较

共同点 1创建复杂对象

不同点 1 Builder用于一步步构造一个复杂对象,并最终返回产品

              2 Abstract Factory用于多个系列产品的对象,立即返回产品

 

 代码如下:

Builder.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 Wall:public Mapsite
  24. {
  25. public:
  26.     Wall();
  27.     virtual void Enter();
  28. };
  29. class Door:public Mapsite
  30. {
  31. public:
  32.   Door(Room* = 0,Room* = 0);
  33.   virtual void Enter();
  34.   Room * OtherSideFrom(Room*);
  35. private:
  36.   Room* _room1;
  37.   Room* _room2;
  38.   bool _isOpen;
  39. };
  40. class Maze {
  41. public:
  42.     //Maze();
  43.     void AddRoom(Room *);
  44.     Room* RoomNo(intconst;
  45. private:
  46.     Room *a[MAX_ROOM_NO];
  47. };
  48. class MazeBuilder
  49. {
  50. public:
  51.     virtual void BuildMaze(){}
  52.     virtual void BuildRoom(int room){}
  53.     virtual void BuildDoor(int roomFrom,int roomTo){}
  54.     virtual Maze* GetMaze(){return 0;}
  55. protected:
  56.     //MazeBuilder();
  57. };
  58. class MazeGame
  59. {
  60. public:
  61.     Maze* CreateMaze(MazeBuilder& builder);
  62. };
  63. class StandardMazeBuilder:public MazeBuilder
  64. {
  65. public:
  66.     StandardMazeBuilder();
  67.     virtual void BuildMaze();
  68.     virtual void BuildRoom(int room);
  69.     virtual void BuildDoor(int roomFrom,int roomTo);
  70.     virtual Maze* GetMaze();
  71. private:
  72.     //Direction CommonWall(Room*,Room*);
  73.     Maze* _currentMaze;
  74. };

Builder.cpp

 

  1. #include <iostream>
  2. using namespace std;
  3. #include "Builder.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. void Room::SetSide(Direction dire,Mapsite* map)
  16. {
  17.  cout<<"Build a Wall on Direction "<<Direstr[dire]<<endl;
  18. }
  19. void Room::Enter()
  20. {
  21.  cout<<"Room enter"<<endl;
  22. }
  23. Wall::Wall()
  24. {
  25.  cout<<"Make a wall"<<endl;
  26. }
  27. void Wall::Enter()
  28. {
  29.  cout<<"Wall enter"<<endl;
  30. }
  31. void Door::Enter()
  32. {
  33.  cout<<"Door enter"<<endl;
  34. }
  35. void Maze::AddRoom(Room *r)
  36. {
  37.  cout<<"Add room to the maze!"<<endl;
  38.  a[r->GetRoomNo()]=r;
  39. }
  40. Room* Maze::RoomNo(int roomNO) const
  41. {
  42.  for (int i=0;i<MAX_ROOM_NO;i++)
  43.  { if (i == roomNO)
  44.    if (!a[i])
  45.     return a[i];
  46.    else
  47.     return 0;
  48.  }
  49.  return 0;
  50. }
  51. Door::Door(Room* r1,Room* r2)
  52. {
  53.  cout<<"A door is installed between 2 rooms"<<endl;
  54. }
  55. Maze* MazeGame::CreateMaze(MazeBuilder& builder)
  56. {
  57.     builder.BuildMaze();
  58.     builder.BuildRoom(1);
  59.     builder.BuildRoom(2);
  60.     builder.BuildDoor(1,2);
  61.     return builder.GetMaze();
  62. }
  63. void StandardMazeBuilder::BuildMaze()
  64. {
  65.   _currentMaze=new Maze;
  66.   
  67. }
  68. Maze* StandardMazeBuilder::GetMaze()
  69. {
  70.     return _currentMaze;
  71. }
  72. void StandardMazeBuilder::BuildRoom(int n)
  73. {
  74.     if (!_currentMaze->RoomNo(n))
  75.     {
  76.         Room *room = new Room(n);
  77.         _currentMaze->AddRoom(room);
  78.         room->SetSide(North,new Wall);
  79.         room->SetSide(South,new Wall);
  80.         room->SetSide(East,new Wall);
  81.         room->SetSide(West,new Wall);
  82.     }
  83. }
  84. void StandardMazeBuilder::BuildDoor(int n1,int n2)
  85. {
  86.     Room *r1=_currentMaze->RoomNo(n1);
  87.     Room *r2=_currentMaze->RoomNo(n2);
  88.     Door *d = new Door(r1,r2);
  89.     r1->SetSide(West,d);
  90.     r2->SetSide(North,d);
  91. }
  92. StandardMazeBuilder::StandardMazeBuilder()
  93. {
  94.  _currentMaze = 0;
  95. }

main.cpp

 

  1. #include "Builder.h"
  2. #include <iostream>
  3. using namespace std;
  4. int main()
  5. {
  6.     Maze* maze;
  7.     cout<<"1"<<endl;
  8.     MazeGame game;
  9.     StandardMazeBuilder builder;
  10.     game.CreateMaze(builder);
  11.     maze = builder.GetMaze();
  12.     return 0;
  13. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值