2003-11-15 11:49
无双
prototype模式<br />定义<br />就是使用原型实例来指定创建对象的种类 并通过拷贝这些原型来创建新的对象<br /><br />例子:<br /><br />例子如下(书上的迷宫类)<br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--><br />// &nbsp;声明管理原型的类<br />class MazePrototypeFactory:public MazeFactory{<br /> &nbsp; &nbsp;public:<br /> &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;声明构造函数,这个函数的参数是一组对象的原型,如Maze对象的原型等<br /> &nbsp; &nbsp; &nbsp; &nbsp;MazePrototypeFactory(Maze*,Wall*,Room*,Door*);<br /><br /> &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;声明根据原型来创建对象的接口<br /> &nbsp; &nbsp; &nbsp; &nbsp;virtual Maze* MakeMaze() const;<br /> &nbsp; &nbsp; &nbsp; &nbsp;virtual Room* MakeRoom(int )cnost;<br /> &nbsp; &nbsp; &nbsp; &nbsp;virtual Wall* MakeWall()const;<br /> &nbsp; &nbsp; &nbsp; &nbsp;virtual Door* MakeDoor(Room*,Room*) const;<br /> &nbsp; &nbsp;private:<br /> &nbsp; &nbsp; &nbsp; &nbsp;// &nbsp;保存原型对象<br /> &nbsp; &nbsp; &nbsp; &nbsp;Maze* _prototypeMaze;<br /> &nbsp; &nbsp; &nbsp; &nbsp;Room* _prototypeRoom;<br /> &nbsp; &nbsp; &nbsp; &nbsp;Wall* _prototypeWall;<br /> &nbsp; &nbsp; &nbsp; &nbsp;Door* _prototypeDoor;<br />};<br /><br /><!--c2--></div><!--ec2--><br /><br />构造函数接口<br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--><br />// &nbsp;在构造函数中保存原型<br />MazePrototypeFactory::MazePrototypeFactory(Maze*m,Wall*w,Room*r,Door*d)<br />{<br /> &nbsp; &nbsp;_prototypeMaze = m;<br /> &nbsp; &nbsp;_prototypeRoom = w;<br /> &nbsp; &nbsp;_prototypeWall = r;<br /> &nbsp; &nbsp;_prototypeDoor = d;<br />}<br /><!--c2--></div><!--ec2--><br /><br />对象创建接口,都是从原型clone得到,所以 每个原型都应该提供Clone接口<br />另外 原型也可以提供其它接口,如果需要一些特殊的初始化的话<br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--><br />// &nbsp;根据原型来创建对象<br />virtual Maze* MazePrototypeFactory::MakeMaze() const<br />{<br /> &nbsp; &nbsp;return _prototypeMaze->Clone();<br />}<br /><br />// &nbsp;根据原型来创建对象,并对对象进行了其它的初始化<br />virtual Door* MazePrototypeFactory::MakeDoor(Room* r1,Room* r2) const<br />{<br /> &nbsp; &nbsp;Door* door = _prototypeDoor->Clone();<br /> &nbsp; &nbsp;door->Initalize(r1,r2);<br /> &nbsp; &nbsp;return door;<br />}<br /><!--c2--></div><!--ec2--><br /><br /><br />图如附件
2003-11-15 12:19
无双
原型法隐藏了对象创建的过程<br /><br />外面不必知道对象的具体类型<br />只须知道它的抽象基类就可以<br />对外隐藏了实现<br />另外 可以有多个原型 <br />这些原型之间不需要有什么关联<br />如上面的<br />Maze*,Wall*,Room*,Door* 这四个对象间没有什么关系 也不是从相同的抽象基类产生的<br /><br />但是使用原型法必须创建一个基类的实例<br /><br />所以 如果你需要创建一组相似的对象的话很合适<br /><br />另外<br />需要每一个原型炻都提供Clone方法<br />这在多数情况下没有问题 但是在有循环引用或其它不支持拷贝的情况下就不适合