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

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

阅读更多


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
...<span s
分享到:
评论

相关推荐

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

    即原型模式,提供一个已经存在的对象进行新对象创建的接口,一般情况下都是使用Clone接口。 此模式非常简单,简单的说就是复制多个当前对象供使用。Prototype模式允许一个对象再创建另外一个可定制的对象,根本...

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

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

    C#面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式)

    本篇文章将深入探讨C#中的“原型模式”(Prototype Pattern),这是一种创建型设计模式,它允许我们通过复制已有对象来创建新对象,而不是从零开始创建。 原型模式的核心思想是克隆。在C#中,对象的克隆可以通过...

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

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

    Python 程序语言设计模式思路-创建型模式:原型模式:通过复制现有对象来创建新对象,面向对象编程

    原型模式(Prototype Pattern)作为创建型模式的一种,通过复制现有对象来创建新对象,从而避免了使用构造函数直接实例化对象的过程。

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

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

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

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

    C#面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式) (Level 300)

    原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而无需知道具体创建过程的细节。在C#中,原型模式是通过接口或抽象类来实现的,通常涉及`ICloneable`接口或者...

    设计模式_创建型_原型模式.md

    原型模式是创建型设计模式中的一种,用于创建重复的对象,同时又能保证性能。这种模式实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的成本过于高昂时,原型模式就显得尤为重要。 **原型模式的...

    白话讲解创建型设计模式:单例原型构建

    本文将聚焦于创建型设计模式,特别是单例模式和原型模式,这两种模式在对象的创建方面扮演着重要的角色。 单例模式是一种限制类实例化次数的设计模式,确保在整个应用程序中,一个类只有一个实例存在。这在某些场景...

    C#视频-面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式)

    在本课程中,我们将深入探讨C#编程中的一个重要设计模式——Prototype原型模式,它是创建型设计模式的一种。原型模式主要用于简化实例化过程,通过复制已有对象来创建新对象,而不是直接通过构造函数来创建。这一...

    设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式

    创建型模式 (100%) 设计模式面面观(5):抽象工厂模式(AbstractFactory)-创建型模式 (100%) 设计模式面面观(6):生成器模式(Builder)-创建型模式 (100%) 设计模式面面观(7):原型模式(Prototype...

    设计模式:创建型之原型(深浅拷贝)、单例(饿汉式与懒汉式),三大工厂模式 结构型之适配器模式,代理模式(三大代理)

    创建型模式关注的是对象的创建过程,包括单例模式、原型模式、工厂模式等。单例模式确保一个类只有一个实例,并提供一个全局访问点;原型模式则是通过复制现有的实例来创建新的实例,适用于创建复杂对象或者避免重复...

    设计模式之创建型模式

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

    实验六:原型模式.rar

    原型模式是其中一种经典的设计模式,它属于创建型模式,主要应用于对象复制或克隆场景。在这个实验六:“原型模式.rar”中,我们将深入理解并实践如何在Java中实现原型模式。 首先,原型模式的核心思想是通过拷贝已...

    设计模式的原型模式的例子

    原型模式(Prototype Pattern)是软件设计模式中的一种结构型模式,它的主要目的是通过复制已有对象来创建新对象,从而减少创建新对象的成本。在原型模式中,类的实例化过程被替换为对已有实例的克隆操作,尤其适用...

    23种设计模式详解PDF

    创建型模式(5): 工厂方法模式 、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式(7): 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式(11): 策略模式...

    设计模式之原型模式

    **原型模式(Prototype Pattern)**是一种创建型设计模式,它提供了一种创建对象的最佳方式,特别是在需要大量相似对象时,可以显著提高效率。在C#中,原型模式允许我们通过复制现有的对象来创建新对象,而不是通过...

Global site tag (gtag.js) - Google Analytics