迷宫 工厂模式练习 编译通过

/************************************************************************/
// 建立一个迷宫(Maze),迷宫的元素是墙、房间、门。它们都是MapSite的子类。
// 同时一个房间有四个方向,有可能是墙也有可能是门。                                                                     */
/************************************************************************/

#include "iostream"
using namespace std;

enum Direction
{
    North,
    East,
    South,
    West,
};

class MapSite
{
public:
    virtual void Enter() = 0;
};

class Room : public MapSite
{
public:
    //类给成员变量赋值的方法,初始化列表,更适用于成员变量的常量const型
    Room(int roomNO) : _roomNumber(roomNO){};

    MapSite *GetSide(Direction) const;

    virtual void SetSide(Direction direction, MapSite*)
    {
        cout << "Set the " << _roomNumber << "room" << direction << "side" <<endl;
    };

    int GetRoomNo()
    {
        return _roomNumber;
    };

    virtual void Enter()
    {
        cout << "Enter the Room" << endl;
    };

private:
    MapSite *_sides[4];
    int _roomNumber;
};

class Wall : public MapSite
{
public:
    Wall(){};

    virtual void Enter()
    {
        cout << "Enter the wall." <<endl;
    }
};

class Door : public MapSite
{
public :
    Door(Room* = 0, Room* = 0){};

    virtual void Enter()
    {
        cout << "Enter the door." <<endl;
    };

    Room *OtherSideFrom(Room*){};

private:
    Room *_room1;
    Room *_room2;
    bool _isOpen;
};

class Maze
{
public:
    Maze(){};

    void AddRoom(Room* room)
    {
        cout << "Add the room" << room->GetRoomNo() <<"."<<endl;
    };

    Room* RoomNo(int) const{};
};

class MazeGame
{
public:
    Maze *CreateMaze();
};

Maze* MazeGame::CreateMaze()
{
    Maze* aMaze = new Maze();
    Room *r1 = new Room(1);
    Room *r2 = new Room(2);
    Door *theDoor  = new Door(r1, r2);

    aMaze->AddRoom(r1);
    aMaze->AddRoom(r2);

    r1->SetSide(North, new Wall);
    r1->SetSide(East,theDoor);
    r1->SetSide(South, new Wall);
    r1->SetSide(West, new Wall);

    return aMaze;
}

int main()
{
    MazeGame mygame;
    mygame.CreateMaze();
    system("pause");
    return 0;
}
#include <iostream>
using namespace std; 

enum Direction {
    North,
    East,
    South,
    West,
}; 

class MapSite {
public:
    virtual void Enter() = 0;
}; 

class Room : public MapSite {
public:
    Room(int roomNo):_roomNumber(roomNo) {}; 

    MapSite *GetSide(Direction) const; 

    virtual void SetSide(Direction direction, MapSite *) {
        cout << "Set the "
            << _roomNumber
            << " room "
            << direction
            << " side."
            << endl;
    }; 

    int GetRoomNo() {
        return _roomNumber;
    }; 

    virtual void Enter() {
        cout << "Enter the Room." << endl;
    }; 

private:
    MapSite *_sides[4];
    int _roomNumber;
}; 

class Wall : public MapSite {
public:
    Wall() {}; 

    virtual void Enter() {
        cout << "Enter the wall." << endl;
    }; 

}; 

class Door : public MapSite {
public:
    Door(Room* = 0, Room* = 0) {}; 

    virtual void Enter() {
        cout << "Enter the door." << endl;
    };
    Room *OtherSideFrom(Room*) {}; 

private:
    Room *_room1;
    Room *_room2;
    bool _isOpen;
}; 

class Maze {
public:
    Maze() {}; 

    void AddRoom(Room* room) {
        cout << "Add the room" << room->GetRoomNo() << "." << endl;
    };
    Room* RoomNo(int) const{};
}; 

//以下为工厂模式不同地方
class MazeFactory {
public:
    MazeFactory() {}; 

    virtual Maze* MakeMaze() const {
        return new Maze;
    }; 

    virtual Wall* MakeWall() const {
        return new Wall;
    }; 

    virtual Room* MakeRoom(int n) const {
        return new Room(n);
    }; 

    virtual Door* MakeDoor(Room* r1, Room* r2) const {
        return new Door(r1, r2);
    };
}; 

class MazeGame {
public:
    Maze* CreateMaze(MazeFactory &factory) {
        Maze* aMaze = factory.MakeMaze();
        Room* r1 = factory.MakeRoom(1);
        Room* r2 = factory.MakeRoom(2);
        Door* theDoor = factory.MakeDoor(r1, r2); 

        aMaze->AddRoom(r1);
        aMaze->AddRoom(r2); 

        r1->SetSide(North, factory.MakeWall());
        r1->SetSide(East, theDoor);
        r1->SetSide(South, factory.MakeWall());
        r1->SetSide(West, factory.MakeWall()); 

        r2->SetSide(North, factory.MakeWall());
        r2->SetSide(East, factory.MakeWall());
        r2->SetSide(South, factory.MakeWall());
        r2->SetSide(West, theDoor); 

        return aMaze;
    };
}; 

int main() {
    MazeGame mygame;
    MazeFactory factory;
    mygame.CreateMaze(factory);
    system("pause");
    return 0;
}
时间: 2024-11-04 16:35:50

迷宫 工厂模式练习 编译通过的相关文章

添加炸弹房的迷宫 工厂模式修改 已编译过

#include <iostream> using namespace std; enum Direction { North, East, South, West, }; class MapSite { public: virtual void Enter() = 0; }; class Room : public MapSite { public: Room(int roomNo):_roomNumber(roomNo) {}; MapSite *GetSide(Direction) co

JAVA设计模式之工厂模式

以下代码仅供展示工厂模式,不能直接编译,因为一个文件中最多只能有一个public class. 一.简单工厂模式:比较简单,produceProduct方法最好是静态的.它是根据参数来决定返回哪一种类型的product. 1 public interface Product 2 { 3 public void getName(); 4 } 5 6 public class ProductA implements Product 7 { 8 public void getName() 9 { 10

第15章 就不能换DB吗?—抽象工厂模式

由于抽象工厂在我们编程当中经常使用和常见,所有本篇文章对<大话设计模式>中的15章做了很详细的比较.通过一个Dao层可以更换访问任意数据库的例子来学习抽象工厂模式.例如:Dao层可以访问Sqlserver数据库,也可以访问Access数据库,当程序新增访问Oracle数据库时,无需修改现有代码,只需要添加访问Oracle相关的类就可以,实现了开闭原则.本篇文章的例子中每种数据库上都有User和Department表,我们Dao层对这两个表进行查询和插入操作. 最基本数据库访问 一下是访问Sql

js工厂模式

设计工厂模式是为了创建对象.通常在类或者类的静态方法中实现,具有两个目标.其中一个是:当创建相似对象时执行重复操作: 另外一个目标是:编译时不知道具体类型(类)的情况下,为工厂客户提供一种创建对象的接口. 实现如下: //父构造器 function CarMaker(){}//在原型中添加共享的方法 CarMaker.prototype.drive = function(){ return "Vroom, I have "+ this.doors + " doors"

表驱动与工厂模式

关于表驱动 首次接触表驱动,还是在毕业不久之后.当时某部门经理给我们讲解重构,即<重构:改善既有代码的设计>一书中简化条件表达式部分,关于if语句的处理,将其替换为多态形式,例如说工厂模式.但是即使替换为工厂,switch或者if的判断依旧不能去除,那么有什么办法解决这个问题呢? 当时我还在研究STL源码,想到了traits编程技术,可以在编译期解决if的判断问题(虽然有这个想法,但是一直没有实现成功).各路大牛提出了不同的见解,大家基本上都同意一条:使用"表"来解决.当时

设计模式(二)工厂模式:2-工厂方法模式

模拟场景: 继续沿用在简单工厂模式中讨论的,运算器相关的场景. 思想: 考虑之前最初的设计,简单工厂模式中,最大的问题在于,面对新增的需要在工厂中创建的对象,对其的修改会违反开闭原则. 工厂方法模式(Factory Method)对于这种问题的解决方案是:将生产运算器的工厂抽象出来(AbsOperationFactory),然后为原来每一个需要创建的对象(继承AbsOperation),都建立一个专门的工厂.这样一来,可以巧妙地利用多态的性质,完成代码的解耦. 由此可见,工厂方法模式,是模板方法

C#设计模式——抽象工厂模式

一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码),而工厂方法模式每个具体工厂类只完成单个实例的创建,所以它具有很好的可扩展性.但是在现实生活中,一个工厂只创建单个产品这样的例子很少,因为现在的工厂都多元化了,一个工厂创建一系列的产品,如果我们要设计这样的系统时,工厂方法模式显然在这里不适用,然后抽象工厂模式却可以很好地解决一系列产品创建的问题,这是本专题所要介绍的内容. 二.抽象工厂详细介绍

1.python实现设计模式:简单工厂模式

简单工厂模式 1.什么是简单工厂模式? 给定一种输入,通过工厂实例出其合适的对象,称为简单工厂模式 2.逐步引入工厂模式 2.1 小文去面试,公司要求用任意一种面对对象的语言实现了一个计算器程序,功能只是简单的两个数相加或者减,乘,除 他的代码如下 def main(): num1 = int(input('The first number is:')) num2 = int(input('The second number is:')) op = input('The operator is(

简单工厂模式(静态工厂方法模式)

以计算器程序为例:只需输入运算符号,程序就实例化出合适的对象.通过多态,返回父类的方式实现了计算器的结果. 1)静态工厂方法统一管理对象的创建. 静态工厂方法通过传入的参数判断决定创建哪一个产品的实例,封装了对象的创建,客户端只管消费,实现了对责任(模块)的分割. 2)静态工厂方法推迟了产品的实例化. 通过XML配置文件就能改变具体创建的产品实例,修改为其他的产品实例,代码不须重新编译. 简单工厂模式结构图 C++代码实例实现: 1 #include<iostream> 2 using nam