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
分享到:
相关推荐
即原型模式,提供一个已经存在的对象进行新对象创建的接口,一般情况下都是使用Clone接口。 此模式非常简单,简单的说就是复制多个当前对象供使用。Prototype模式允许一个对象再创建另外一个可定制的对象,根本...
【设计模式之创建型模式实验】 创建型设计模式主要关注对象的创建,它们提供了一种在不指定具体类的情况下创建对象的方式,增强了系统的灵活性和可扩展性。在本实验中,我们将探讨五种常见的创建型设计模式:简单...
本篇文章将深入探讨C#中的“原型模式”(Prototype Pattern),这是一种创建型设计模式,它允许我们通过复制已有对象来创建新对象,而不是从零开始创建。 原型模式的核心思想是克隆。在C#中,对象的克隆可以通过...
JAVA-设计模式-创建型模式-原型模式
原型模式(Prototype Pattern)作为创建型模式的一种,通过复制现有对象来创建新对象,从而避免了使用构造函数直接实例化对象的过程。
设计模式分为三大类:创建型模式、结构型模式和行为型模式。 **创建型模式**关注的是对象的创建。共有五种创建型模式: 1. **工厂方法模式**:它定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法...
创建型模式是指在软件设计中,如何创建对象的模式。它主要解决了对象创建的问题,包括简单工厂、工厂方法、抽象工厂、单例、构造者和原型等六种模式。 1. 简单工厂模式:该模式提供了一种封装对象实例化的方式,...
原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而无需知道具体创建过程的细节。在C#中,原型模式是通过接口或抽象类来实现的,通常涉及`ICloneable`接口或者...
原型模式是创建型设计模式中的一种,用于创建重复的对象,同时又能保证性能。这种模式实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的成本过于高昂时,原型模式就显得尤为重要。 **原型模式的...
本文将聚焦于创建型设计模式,特别是单例模式和原型模式,这两种模式在对象的创建方面扮演着重要的角色。 单例模式是一种限制类实例化次数的设计模式,确保在整个应用程序中,一个类只有一个实例存在。这在某些场景...
在本课程中,我们将深入探讨C#编程中的一个重要设计模式——Prototype原型模式,它是创建型设计模式的一种。原型模式主要用于简化实例化过程,通过复制已有对象来创建新对象,而不是直接通过构造函数来创建。这一...
创建型模式 (100%) 设计模式面面观(5):抽象工厂模式(AbstractFactory)-创建型模式 (100%) 设计模式面面观(6):生成器模式(Builder)-创建型模式 (100%) 设计模式面面观(7):原型模式(Prototype...
创建型模式关注的是对象的创建过程,包括单例模式、原型模式、工厂模式等。单例模式确保一个类只有一个实例,并提供一个全局访问点;原型模式则是通过复制现有的实例来创建新的实例,适用于创建复杂对象或者避免重复...
创建型模式作为设计模式的五种主要类别之一,它主要关注的是对象的创建过程,通过抽象和封装创建过程中的变化点,使得系统能够更加灵活地应对未来的变化。 创建型模式包括多种不同的模式,例如工厂模式、单态模式、...
原型模式是其中一种经典的设计模式,它属于创建型模式,主要应用于对象复制或克隆场景。在这个实验六:“原型模式.rar”中,我们将深入理解并实践如何在Java中实现原型模式。 首先,原型模式的核心思想是通过拷贝已...
原型模式(Prototype Pattern)是软件设计模式中的一种结构型模式,它的主要目的是通过复制已有对象来创建新对象,从而减少创建新对象的成本。在原型模式中,类的实例化过程被替换为对已有实例的克隆操作,尤其适用...
创建型模式(5): 工厂方法模式 、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式(7): 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式(11): 策略模式...
**原型模式(Prototype Pattern)**是一种创建型设计模式,它提供了一种创建对象的最佳方式,特别是在需要大量相似对象时,可以显著提高效率。在C#中,原型模式允许我们通过复制现有的对象来创建新对象,而不是通过...