标签:返回 creat tor 必须 main 包括 dma 缺点 还需要
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以表示不同的表示。
——定义并明确它所创建的表示。
——提供一个检索产品的接口。
——包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
ConcreteBuilder中需要提供构建产品的的各个部件的函数,以及对外获取被创建产品的接口。还是以创建迷宫为例,迷宫产品组件包括迷宫自身、房间、门,这些组件创建函数(BuildPart)需定义为虚函数,以便子类继承实现。在产品各部分创建好了后,需要通过对外的接口GetResult来获取创建的产品,本例GetMaze返回创建的迷宫。
class MazeBuilder{ public: virtual void BuildMaze(){} virtual void BuildRoom(int Room){} virtual void BuildDoor(int roomFrom, int RoomTo){} virtual Maze* GetMaze(){return 0;} protected: MazeBuilder(); };
因为builder中BuildPart和GetResult函数都是虚函数,所以Director并不关心继承Builder的子类实现,Director只需要按部就班的调用Builder的BuildPart函数来创建产品,如下例:
builder.BuildMaze();//创建迷宫
builder.BuildRoom(1);//创建1号房间
builder.BuildRoom(2);//创建2号房间
builder.BuildDoor(1,2);//创建1号房间和2号房间的门
在产品各个部件创建完成后,调用:
build.GetMaze();//获取已创建迷宫
Maze* MazeGame::CreateMaze(MazeBuilder& builder){ builder.BuildMaze(); builder.BuildRoom(1); builder.BuildRoom(2); builder.BuildDoor(1,2); return builder.GetMaze(); }
MazeBuilder基类提供实现产品的接口,具体实现还需要子类来实现。这里StandardMazeBuilder继承MazeBuilder并实现了基本功能。
StandardMazeBuilder类声明:
class StandardMazeBuilder:public MazeBuilder{ public: StandardMazeBuilder(); virtual void BuildMaze(); virtual void BuildRoom(int); virtual void BuildDoor(int,int); virtual Maze* GetMaze(); private: Direction CommonWall(Room *, Room *); Maze * _currentMaze; }
StandardMazeBuilder类实现:
#include "Builder.h" StandardMazeBuilder::StandardMazeBuilder(){ _currentMaze = 0; } void StandardMazeBuilder::BuildMaze(){ _currentMaze = new Maze; } Maze* StandardMazeBuilder::GetMaze(){ return _currentMaze; } void StandardMazeBuilder::BuildRoom(int n){ if(!_currentMaze->RoomNo(n)){ Room* room = new Room(n); _currentMaze->AddRoom(room); room->SetSide(North, new Wall); room->SetSide(South, new Wall); room->SetSide(East, new Wall); room->SetSide(West, new Wall); } } void StandardMazeBuilder::BuildDoor(int n1, int n2){ Room *r1 = _currentMaze->RoomNo(n1); Room *r2 = _currentMaze->RoomNo(n2); Door *d = new Door(r1,r2); r1->SetSide(CommonWall(r1,r2),d); r2->SetSide(CommonWall(r2,r1),d); }
在实现了Director和Builder后,Client无需关心具体产品的具体实现,只需要新建该Builder类,传递给Director,就能创建出不同的产品了。
#include "Direcotr.h" #include "StandardMazeBuilder.h" int Main(){ Maze *maze; MazeGame game; StandardMazeBuilder builder; game.CreateMaze(builder); maze = builder.GetMaze(); return 0; }
优点:
缺点:
参考文献:
GOF《设计模式》
标签:返回 creat tor 必须 main 包括 dma 缺点 还需要
原文地址:http://www.cnblogs.com/chenyangchun/p/7326621.html