`
isiqi
  • 浏览: 16551677 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

设计模式中创建型模式

阅读更多

相关的类图结构:

一直在看创建型,现在看的有两种模式:
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);
分享到:
评论

相关推荐

    设计模式之创建型模式实验.docx

    【设计模式之创建型模式实验】 创建型设计模式主要关注对象的创建,它们提供了一种在不指定具体类的情况下创建对象的方式,增强了系统的灵活性和可扩展性。在本实验中,我们将探讨五种常见的创建型设计模式:简单...

    5种创建型设计模式

    GOF的23中设计模式中,五种创建型模式的介绍。

    23种设计模式,创建型模式共5种,结构型模式7种,行为型模式11种

    设计模式分为三大类:创建型模式、结构型模式和行为型模式。 **创建型模式**关注的是对象的创建。共有五种创建型模式: 1. **工厂方法模式**:它定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法...

    设计模式之创建型模式

    创建型模式作为设计模式的五种主要类别之一,它主要关注的是对象的创建过程,通过抽象和封装创建过程中的变化点,使得系统能够更加灵活地应对未来的变化。 创建型模式包括多种不同的模式,例如工厂模式、单态模式、...

    设计模式(创建型、结构型、行为型)

    创建型模式是指在软件设计中,如何创建对象的模式。它主要解决了对象创建的问题,包括简单工厂、工厂方法、抽象工厂、单例、构造者和原型等六种模式。 1. 简单工厂模式:该模式提供了一种封装对象实例化的方式,...

    软件设计模式作业 创建型设计模式

    使用工厂方法模式重构上个学期的简易四则计算器(带用户界面),并在原有四则计算器中拓展功能,增加指数和对数两种二元运算。 2、建造者模式 2.1 作业题目 假设生产计算机只需要CPU、内存、显卡、显示器和光驱,现在...

    C#面向对象设计模式纵横谈-1.Singleton 单件(创建型模式)

    在提供的"1.Singleton 单件(创建型模式).wmv"视频文件中,可能详细讲解了Singleton模式的概念、实现方式、优缺点以及在C#中的具体应用实例,包括如何在实际项目中适当地使用和避免滥用Singleton模式。观看该视频可以...

    设计模式1-创建型模式

    "设计模式1-创建型模式" 设计模式是软件设计中的一种解决方案,它提供了一种通用的设计方案,解决了面相对象系统中重复出现的设计问题。设计模式的学习和运用对软件系统开发有着非常重要的意义,它可以帮助开发者更...

    创建型设计模式(上)

    简单工厂模式是最基础的一种创建型模式。它的核心思想是定义一个静态工厂方法,由这个方法根据传入的参数决定创建哪种类型的对象。这种方式能够有效地隐藏对象创建的具体细节,使得客户端代码不必关心对象创建的过程...

    软件设计模式实验1创建型模式源码

    1、使用工厂方法模式重构上个学期的简易四则计算器(带用户界面),并在原有四则计算器中拓展功能,增加指数和对数两种二元运算。 2、假设生产计算机只需要CPU、内存、显卡、显示器和光驱,现在要生产3个不同型号的...

    软件设计模式创建型模式实验代码

    包含三个实验,建造者模式(假设生产计算机只需要CPU、内存、显卡、显示器和光驱),抽象工厂模式(某手机操作系统可以根据用户不同的喜好在多种主题之间进行切换,随着主题的变化,系统中的字体、app图标、壁纸、...

    设计模式 创建型模式 Prototype模式(原型)

    原型模式中的拷贝分为“浅拷贝”和“深拷贝”: 浅拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象。 深拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量...

    人人都懂设计模式 人人都懂设计模式

    设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。 在本书中,作者罗伟富通过 Python 实现了 23 种经典设计模式,包括 Singleton 模式、Factory 模式、Observer 模式等。这些模式可以帮助开发者更好地...

    设计模式之创建型模式.pdf

    创建型模式是软件工程中23种设计模式中的一类,主要目的是使得对象的创建与使用相分离,从而使系统更加灵活。创建型模式包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式等。这些模式各有其特定的...

    抽象工厂模式 设计模式中创建型之抽象工厂模式

    抽象工厂模式是软件设计模式中的一种创建型模式,它的主要思想是提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。在实际应用中,它常用于跨平台开发,或者当系统需要根据不同的条件创建...

    GOF设计模式中英文+设计模式精解中英文

    设计模式分为三大类:创建型模式、结构型模式和行为型模式。创建型模式关注对象的创建过程,如单例模式、工厂模式、建造者模式等;结构型模式关注如何组合对象和类以构建更复杂的设计,如适配器模式、装饰器模式、...

    Java设计模式之创建型模式源码以及文档

    在"Java设计模式之创建型模式源码以及文档"中,你将找到这些模式的具体实现,包括源码和相关文档。通过阅读源码,你可以深入理解每种模式的内部工作机制,而文档则会提供理论背景和应用场景的解释,帮助你更好地运用...

    JAVA-设计模式-创建型模式-原型模式

    JAVA-设计模式-创建型模式-原型模式

    JAVA-设计模式-创建型模式-单例模式

    JAVA-设计模式-创建型模式-单例模式

Global site tag (gtag.js) - Google Analytics