基於建立型模式的「迷宮」構造

2021-04-20 21:32:45 字數 4519 閱讀 4058

本文在gof《設計模式》一書「建立型模式」一章的例子和模式的基礎上,將各個建立型模式有機的結合在一起。實現了「迷宮」構造過程的封裝,增強了構造不同迷宮的可擴充套件性。

建立型模式:

抽象工廠

工廠方法

生成器原型

單件其中,抽象工廠是由工廠方法組成的,是一組相互關聯的工廠方法的集合。

「迷宮」構造類圖:

以下是各個模組的c++實現:

#ifndef _part_h_

#define _part_h_

//part.h

enum direction

;class mapsite

;class room:public mapsite

mapsite* getside(direction d) const

void setside(direction d, mapsite* ms)

virtual

void enter()

virtual

char* getinfo()

int roomno() const

private:

mapsite* _sides[4];

int _roomno;

};class wall:public mapsite

virtual

void enter()

virtual

char* getinfo()

};class door:public mapsite

room* othersidefrom(room* r)

virtual

void enter()

virtual

char* getinfo()

private:

room* _room1;

room* _room2;

bool _isopen;

};class spell

};class enchantedroom: public room

virtual

void enter()

virtual

char* getinfo()

private:

spell* _spell;

};class doorneedingspell:public door

virtual

void enter()

virtual

char* getinfo()

};class roomwithabomb: public room

virtual

void enter()

virtual

char* getinfo()

};class bombedwall:public wall

virtual

void enter()

virtual

char* getinfo()

};class maze

_xsize = xsize;

_ysize = ysize;

_roomlist = new room*[_xsize*_ysize];

for(int i=0; i<_xsize*_ysize; ++i)

_roomlist[i] = 0;

}void addroom(room* r)

room* roomno(int rno) const

return 0;

}int xsize() const

int yszie() const

int size() const

~maze()

private:

room** _roomlist;

int _xsize;

int _ysize;

}; #endif

//partfactory.h

#ifndef _part_factory_h_

#define _part_factory_h_

#include "part.h"

#include 

class bombedpartfactory;

class enchantedpartfactory;

class partfactory

private:

static std::string _mazestyle;

static partfactory* _instance;

protected:

partfactory(){}

public:

virtual room* makeroom(int rno) const

virtual wall* makewall() const

virtual door* makedoor(room* r1, room* r2) const

};class enchantedpartfactory:public partfactory

virtual room* makeroom(int rno) const

virtual door* makedoor(room* r1, room* r2) const

protected:

spell* castspell() const

};class bombedpartfactory:public partfactory

virtual room* makeroom(int rno) const

virtual wall* makewall() const

}; #endif

//partfactory.cpp

#include "partfactory.h"

partfactory* partfactory::_instance = 0;

std::string partfactory::_mazestyle;

partfactory* partfactory::instance()

return _instance;}

//mazebuilder.h

#ifndef _maze_builder_h_

#define _maze_builder_h_

#include "partfactory.h"

class mazebuilder

void buildmaze()

maze* getmaze()

virtual

void buildroom(int rno) 

virtual

void builddoor(int roomfrom, int roomto)

protected:

direction commonwall(room* r1, room* r2)

maze* _maze;

partfactory* _factory;

};class stdmazebuilder:public mazebuilder

virtual

void buildroom(int rno) 

}virtual

void builddoor(int roomfrom, int roomto)

}; #endif

//mazedrawer.h

#ifndef _maze_draw_h_

#define _maze_draw_h_

#include "part.h"

#include 

class mazedrawer

std::cout << "    "

<< dir << ":"

<< r->getside((direction)j)->getinfo() << std::endl;}}

}}}; #endif

//mazegame.h

#ifndef _maze_game_h_

#define _maze_game_h_

#include "mazebuilder.h"

#include "mazedrawer.h"

class mazegame

virtual maze* createmaze(mazebuilder& mb) = 0;

void deletemaze(maze* maze)

{}void drawmaze(maze* maze)

private:

mazedrawer* _mazedrawer;

};class game1:public mazegame

virtual maze* createmaze(mazebuilder& mb)

}; #endif

// mazegame.cpp : 定義控制台應用程式的入口點。

// #include "stdafx.h"

#include "mazegame.h"

int _tmain(int argc, _tchar* argv)

希望通道中人提出意見建議,共同改善完善,共同交流:[email protected]

建立型模式 原型模式

使用原型例項指定建立物件的種類,並且通過轉殖這些原型建立新的物件 原理是將乙個原型物件傳給要發動建立的物件,該物件通過請求原型物件轉殖自己來建立過程 轉殖方法 public prototype clone jdk中為我們提供了轉殖的方法clone 從object繼承下來,乙個物件要實現轉殖,需要實現...

建立型模式 原型模式

原型 prototype 模式主要用於建立物件的轉殖,通常其最簡單的形式就是採用自定 clone 函式並 傳入物件引數以返回此物件的乙個副本,這在 python 實作上可使用內定 copy.cop y 或 copy.deepcopy 函式來達到此目的。當已有乙個物件但對此物件的某些部分會被變更卻又想...

原型模式 建立型模式

文章首發個人部落格 如果我們有乙個類 sheep 它裡面有兩個屬性,名稱 name 年齡 age 現在我們有乙個它的例項 s1 我們需要按照這個例項的屬性再去建立兩個物件。1 sheep data public class sheep 2 main public class main 原型模式 用原...