设计模式中创建型模式 (二):原型模式

本文介绍原型模式在MazeGame中的应用,展示了如何通过克隆机制创建迷宫组件,如墙壁、房间和门等,并提供了具体的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


Prototype(原型模式)
简单的讲,就是一种克隆模式,使得一个系统独立于它的产品的创建、构成和表示。
它有和Abstract Factory和Builder一样的效果:它对客户隐藏了具体的产品类。另外,Prototype模式还有另外一些优点:
1、运行时刻增加和删除产品
2、用类动态配置应用。
它的主要缺陷是每一个Prototype的子类都必需实现Clone操作,这可能很困难。例如,当所考虑的类已经存在时就难以新增Clone操作。
当内部包括一些不支持拷贝或有循环引用的对象时,实现克隆可能也会很困难的。
我们将定义MazeFactory的子类MazePrototypeFactory.该子类将使用它要创建的对象的原型来为初始化,这样我们就不需要仅仅为了改变它所
创建的墙壁或房间的类而生子类了。

以下为示例代码:(VC6+sp6)下测试通过

//MapSite.h
#pragmawarning(disable:4786)


#include
<vector>
#include
<map>
#include
<iostream>
usingnamespacestd;


//##ModelId=48059C280115
enumDirection
...{
North,South,East,West
}
;

/**///////////////////////////////////////////////////////////////////////////
//申明所有类
classDoor;
classMapSite;
classMaze;
classMazeBuilder;
classMazeFactory;
classMazeGame;
classRoom;
classStandardMazeBuilder;
classWall;
classMazePrototypeFactory;
/**///////////////////////////////////////////////////////////////////////////

//##ModelId=48059C2800E6
classMapSite
...{
public:
//##ModelId=48059C280105
virtualvoidEnter()=0;
}
;

//##ModelId=48059C280172
classWall:publicMapSite
...{
public:
//##ModelId=48059C280183
Wall()...{}

virtualWall*Clone()const;

//##ModelId=48059C280184
virtualvoidEnter()...{printf("Wall::Enter()");}
}
;


//##ModelId=48059C280134
classRoom:publicMapSite
...{
public:
//##ModelId=48059C280144
Room(introomNo=0)...{_roomNumber=roomNo;}
//##ModelId=48059C280146
MapSite*GetSide(Directiond)const...{return_sides[d];}
//##ModelId=48059C280154
voidSetSide(Directiond,MapSite*s)...{_sides[d]=s;}

Room(
constRoom&other);
virtualRoom*Clone();
virtualvoidInitialize(intn);
//##ModelId=48059C280157
virtualvoidEnter()...{printf("Room::Enter()");}

//##ModelId=48059C280159
intGetRoomNo()const...{return_roomNumber;}
private:
//##ModelId=48059C280164
MapSite*_sides[4];
//##ModelId=48059C280168
int_roomNumber;
}
;

//##ModelId=48059C280191
classDoor:publicMapSite
...{
public:
//##ModelId=48059C2801A1
Door(Room*r1=0,Room*r2=0)...{_room1=r1;_room2=r2;}

Door(
constDoor&other);

virtualvoidInitialize(Room*r1,Room*r2);
virtualDoor*Clone()const;
//##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()...{}

Maze(
constMaze&other);
virtualMaze*Clone();

//##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;
}
;


//创建迷宫的类
//##ModelId=48059C28023D
classMazeGame:publicMaze
...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值