相关的类图结构:

设计模式中创建型模式

一直在看创建型,现在看的有两种模式:
Abstract factory(抽象工厂模式)
Builder(生成器模式)
这里用一个迷宫程序来说明这两种模式。
类MapSite是所有迷宫组件的公共抽象类。为简化例子,MapSite仅定义了一个操作Enter.
如果你进入一个房间,那么你的位置会发生改变。如果你试图进入一扇门,那么这两件事中
就会有一件发生:如果门是开着的,你进入另一个房间,如果门是关着的,那么你就会碰壁。
Room是MapSite的一个具体的子类,而MapSite定义了迷宫中构件之间的主要关系。
Room有指向其它MapSite对象的引用,并保存一个房间号,这个数字用来标识迷宫中的房间。
Enter为更加复杂的游戏操作提供了一个简单基础。例如,如果你在一个房间中说“向东走”,
游戏只能确定直接在东边的是哪一个MapSite并对它进行调用Enter.特定子类的Enter操作将计算
出你的位置是发生改变还是你会碰壁。在一个真正的游戏中,Enter可以将移动的游戏者作为一个参数。

我们定义的另一个类是MazeGame,由它来创建迷宫。一个简单直接的创建迷宫的方法是使用一系列的操作
将构件增加到迷宫中,然后连接它们。例如,下面的成员函数将创建一个迷宫,这个迷宫由两个房间和它们之间
的一扇门组成。Maze* MazeGame::CreateMaze(),这样的代码比较直接,属硬编
码方式
MazeFactory是一个创建迷宫的类工厂,它将创建迷宫的细节隐藏在这个工厂中,建造迷宫的程序将MazeFactory作为一个参数,这样程序员就能指定要创建的房间,墙壁和门等类。
MazeBuilder类则是采用一步步建造所有部件的方式来建迷宫。
abstract factory
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
它分离了具体的类,将客户与类的实现分离
它使得晚于交换产品系列
它有利于产品的一致性
难以支持新种类的产品
创建时常春藤用的一些技术:
1、将工厂作为单件
2、创建产品 。
以下将使用Abstract Factory模式创建我们前面所讨论的迷宫
类MazeFactory可以创建迷宫的组件。它建造房间,墙壁和房间之间的门。它可以
用于一个从文件中读取迷宫说明书图并建造迷宫的程序。或者它可以被用于一个
随机建造迷宫的程序。

Abstract Factory与Builder相似,因为它也可以创建复杂对象。主要的区别在于Builder模式
着重于一步步构造一个复杂对象。而Abstract Factory着重于多个系列的产品对象。Builder
在最后的一步返回产品,而对于Abstract Factory来说,产品是立即返回的。另外,Builder模式每一步产生一个组件,在其内部组合成一个对象后返回该对象。而Abstract Factory则是返回一系列的产品对象,内部不进行组合的动作,这是它们之间的最大的区别。

以下为相关代码,可以比较这两种模式的区别。

设计模式中创建型模式//MapSite.h
设计模式中创建型模式
#pragmawarning(disable:4786)
设计模式中创建型模式
设计模式中创建型模式
设计模式中创建型模式#include
<vector>
设计模式中创建型模式#include
<map>
设计模式中创建型模式
usingnamespacestd;
设计模式中创建型模式
设计模式中创建型模式
//##ModelId=48059C2800E6
设计模式中创建型模式
classMapSite
设计模式中创建型模式设计模式中创建型模式
...{
设计模式中创建型模式
public:
设计模式中创建型模式
//##ModelId=48059C280105
设计模式中创建型模式
virtualvoidEnter()=0;
设计模式中创建型模式}
;
设计模式中创建型模式
设计模式中创建型模式
//##ModelId=48059C280115
设计模式中创建型模式
enumDirection
设计模式中创建型模式设计模式中创建型模式
...{
设计模式中创建型模式North,South,East,West
设计模式中创建型模式}
;
设计模式中创建型模式
设计模式中创建型模式
//##ModelId=48059C280134
设计模式中创建型模式
classRoom:publicMapSite
设计模式中创建型模式设计模式中创建型模式
...{
设计模式中创建型模式
public:
设计模式中创建型模式
//##ModelId=48059C280144
设计模式中创建型模式设计模式中创建型模式
Room(introomNo)...{_roomNumber=0;}
设计模式中创建型模式
//##ModelId=48059C280146
设计模式中创建型模式设计模式中创建型模式
MapSite*GetSide(Directiond)const...{return_sides[d];}
设计模式中创建型模式
//##ModelId=48059C280154
设计模式中创建型模式设计模式中创建型模式
voidSetSide(Directiond,MapSite*s)...{_sides[d]=s;}
设计模式中创建型模式
设计模式中创建型模式
//##ModelId=48059C280157
设计模式中创建型模式设计模式中创建型模式
virtualvoidEnter()...{printf("Room::Enter()");}
设计模式中创建型模式
设计模式中创建型模式
//##ModelId=48059C280159
设计模式中创建型模式设计模式中创建型模式
intGetRoomNo()const...{return_roomNumber;}
设计模式中创建型模式
private:
设计模式中创建型模式
//##ModelId=48059C280164
设计模式中创建型模式
MapSite*_sides[4];
设计模式中创建型模式
//##ModelId=48059C280168
设计模式中创建型模式
int_roomNumber;
设计模式中创建型模式}
;
设计模式中创建型模式
设计模式中创建型模式
设计模式中创建型模式
//##ModelId=48059C280172
设计模式中创建型模式
classWall:publicMapSite
设计模式中创建型模式设计模式中创建型模式
...{
设计模式中创建型模式
public:
设计模式中创建型模式
//##ModelId=48059C280183
设计模式中创建型模式设计模式中创建型模式
Wall()...{}
设计模式中创建型模式
//##ModelId=48059C280184
设计模式中创建型模式设计模式中创建型模式
virtualvoidEnter()...{printf("Wall::Enter()");}
设计模式中创建型模式}
;
设计模式中创建型模式
设计模式中创建型模式
设计模式中创建型模式
//##ModelId=48059C280191
设计模式中创建型模式
classDoor:publicMapSite
设计模式中创建型模式设计模式中创建型模式
...{
设计模式中创建型模式
public:
设计模式中创建型模式
//##ModelId=48059C2801A1
设计模式中创建型模式设计模式中创建型模式
Door(Room*r1=0,Room*r2=0)...{_room1=r1;_room2=r2;}
设计模式中创建型模式
设计模式中创建型模式
//##ModelId=48059C2801A4
设计模式中创建型模式设计模式中创建型模式
virtualvoidEnter()...{printf("Door::Enter()");};
设计模式中创建型模式
//##ModelId=48059C2801A6
设计模式中创建型模式
Room*OtherSideFrom(Room*);
设计模式中创建型模式
private:
设计模式中创建型模式
//##ModelId=48059C2801A9
设计模式中创建型模式
Room*_room1;
设计模式中创建型模式
//##ModelId=48059C2801B2
设计模式中创建型模式
Room*_room2;
设计模式中创建型模式
//##ModelId=48059C2801B6
设计模式中创建型模式
bool_isOpen;
设计模式中创建型模式}
;
设计模式中创建型模式
设计模式中创建型模式
//##ModelId=48059C2801C0
设计模式中创建型模式
classMaze
设计模式中创建型模式设计模式中创建型模式
...{
设计模式中创建型模式
public:
设计模式中创建型模式
//##ModelId=48059C2801D0
设计模式中创建型模式设计模式中创建型模式
Maze()...{}
设计模式中创建型模式
设计模式中创建型模式
//##ModelId=48059C2801D1
设计模式中创建型模式
voidAddRoom(Room*r)
设计模式中创建型模式设计模式中创建型模式
...{
设计模式中创建型模式maproom[r
->GetRoomNo()]=r;
设计模式中创建型模式}

设计模式中创建型模式
//##ModelId=48059C2801D3
设计模式中创建型模式设计模式中创建型模式
Room*RoomNo(intno)...{returnmaproom[no];}
设计模式中创建型模式
设计模式中创建型模式
private:
设计模式中创建型模式
//##ModelId=48059C2801EF
设计模式中创建型模式
map<int,Room*>maproom;
设计模式中创建型模式
//
设计模式中创建型模式
}
;
设计模式中创建型模式
设计模式中创建型模式
设计模式中创建型模式
//建造迷宫的程序将MazeFactory作为一个参数,这样程序员就能指定要创建的房间,
设计模式中创建型模式
//墙壁和门等类
设计模式中创建型模式
//##ModelId=48059C2801FF
设计模式中创建型模式
classMazeFactory
设计模式中创建型模式设计模式中创建型模式
...{
设计模式中创建型模式
public:
设计模式中创建型模式
//##ModelId=48059C280200
设计模式中创建型模式设计模式中创建型模式
MazeFactory()...{}
设计模式中创建型模式
设计模式中创建型模式
//##ModelId=48059C280201
设计模式中创建型模式
virtualMaze*MakeMaze()const
设计模式中创建型模式设计模式中创建型模式
...{
设计模式中创建型模式
returnnewMaze;
设计模式中创建型模式}

设计模式中创建型模式
//##ModelId=48059C280203
设计模式中创建型模式
virtualWall*MakeWall()const
设计模式中创建型模式设计模式中创建型模式
...{
设计模式中创建型模式
returnnewWall;
设计模式中创建型模式}

设计模式中创建型模式
//##ModelId=48059C28020F
设计模式中创建型模式
virtualRoom*MakeRoom(intn)const
设计模式中创建型模式设计模式中创建型模式
...{
设计模式中创建型模式
returnnewRoom(n);
设计模式中创建型模式}

设计模式中创建型模式
//##ModelId=48059C280212
设计模式中创建型模式
virtualDoor*MakeDoor(Room*r1,Room*r2)const
设计模式中创建型模式设计模式中创建型模式
...{
设计模式中创建型模式
returnnewDoor(r1,r2);
设计模式中创建型模式}

设计模式中创建型模式}
;
设计模式中创建型模式
设计模式中创建型模式
设计模式中创建型模式
//创建各个部件,作用类似于MazeGame::CreateMaze();
设计模式中创建型模式
//##ModelId=48059C28021E
设计模式中创建型模式
classMazeBuilder
设计模式中创建型模式设计模式中创建型模式
...{
设计模式中创建型模式
public:
设计模式中创建型模式
//##ModelId=48059C28021F
设计模式中创建型模式设计模式中创建型模式
virtualvoidBuildMaze()...{}
设计模式中创建型模式
//##ModelId=48059C280221
设计模式中创建型模式设计模式中创建型模式
virtualvoidBuildRoom(introom)...{}
设计模式中创建型模式
//##ModelId=48059C28022F
设计模式中创建型模式设计模式中创建型模式
virtualvoidBuildDoor(introomFrom,introomTo)...{}
设计模式中创建型模式
设计模式中创建型模式
//##ModelId=48059C280233
设计模式中创建型模式设计模式中创建型模式
virtualMaze*GetMaze()...{return0;}
设计模式中创建型模式
protected:
设计模式中创建型模式
//##ModelId=48059C280235
设计模式中创建型模式设计模式中创建型模式
MazeBuilder()...{}
设计模式中创建型模式
设计模式中创建型模式}
;
设计模式中创建型模式
设计模式中创建型模式
classStandardMazeBuilder:publicMazeBuilder
设计模式中创建型模式设计模式中创建型模式
...{
设计模式中创建型模式
public:
设计模式中创建型模式设计模式中创建型模式StandardMazeBuilder()
...{_currentMaze=0;}
设计模式中创建型模式
设计模式中创建型模式设计模式中创建型模式
virtualvoidBuildMaze()...{_currentMaze=(Maze*)newStandardMazeBuilder;}
设计模式中创建型模式
virtualvoidBuildRoom(int);
设计模式中创建型模式
virtualvoidBuildDoor(int,int);
设计模式中创建型模式
设计模式中创建型模式设计模式中创建型模式
virtualMaze*GetMaze()...{return_currentMaze;}
设计模式中创建型模式
private:
设计模式中创建型模式DirectionCommonWall(Room
*,Room*);//决定哪两个相邻的墙可以有门。
设计模式中创建型模式
Maze*_currentMaze;
设计模式中创建型模式}
;
设计模式中创建型模式
设计模式中创建型模式
voidStandardMazeBuilder::BuildRoom(intn)
设计模式中创建型模式设计模式中创建型模式
...{
设计模式中创建型模式
if(!_currentMaze->RoomNo(n))
设计模式中创建型模式设计模式中创建型模式
...{
设计模式中创建型模式Room
*room=newRoom(n);
设计模式中创建型模式_currentMaze
->AddRoom(room);
设计模式中创建型模式
设计模式中创建型模式room
->SetSide(North,newWall);
设计模式中创建型模式room
->SetSide(South,newWall);
设计模式中创建型模式room
->SetSide(East,newWall);
设计模式中创建型模式room
->SetSide(West,newWall);
设计模式中创建型模式}

设计模式中创建型模式}

设计模式中创建型模式
设计模式中创建型模式
voidStandardMazeBuilder::BuildDoor(intn1,intn2)
设计模式中创建型模式设计模式中创建型模式
...{
设计模式中创建型模式Room
*r1=_currentMaze->RoomNo(n1);
设计模式中创建型模式Room
*r2=_currentMaze->RoomNo(n2);
设计模式中创建型模式Door
*d=newDoor(r1,r2);
设计模式中创建型模式
设计模式中创建型模式r1
->SetSide(CommonWall(r1,r2),d);

相关文章:

  • 2021-10-13
  • 2021-10-16
  • 2022-02-05
  • 2022-01-14
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-12-22
  • 2021-06-27
  • 2021-04-21
相关资源
相似解决方案