原型:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原型实现:1.用于创建对象的具体类必须实现clone()操作,用于对象克隆自己以生成新的对象。下面通过原型来实现一个抽象工厂MazePrototypeFactory,creator使用原型工厂来创建对象。派生MazePrototypeFactory原型工厂:
/* 原型工厂 */class MazePrototypeFactory:public MazeFactory {public: MazePrototypeFactory(Maze*, Wall*, Room*, Door*); virtual Maze* MakeMaze() const; virtual Maze* MakeMaze(int) const; virtual Wall* MakeWall() const; virtual Door* MakeDoor(Room*, Room*) const; private: Maze* _prototypeMaze; Room* _prototypeRoom; Wall* _prototypeWall; Door* _prototypeDoor; };
使用原型对象来配置一个原型工厂,原型工厂构造方法实现:
/* 原型工厂构造方法:使用原型对象来配置一个原型工厂 */MazePrototypeFactory::MazePrototypeFactory( Maze* m, Wall* w, Room* r, Door* d ) { _prototypeMaze = m; _prototypeRoom = r; _prototypeWall = w; _prototypeDoor = d; }
原型工厂创建对象的方法是通过对象克隆:
/* 使用对象克隆来创建新的对象 */Wall* MazePrototypeFactory::makeWall () const { return _prototypeWall->Clone(); }/* 创建其他对象代码类似 */
创建迷宫地图的客户代码:
/* 创建迷宫的客户代码 */MazeGame game;MazePrototypeFactory simpleFactory(new Maze, new Wall, new Room, new Door);Maze* maze = game.CreateMaze(simpleMazeFactory);
原型工厂与抽象工厂比较:原型工厂不需要派生新的子类就可以来创建新的对象,只需要使用不同的原型对象来配置原型工厂即可。