LoveUnix » 行业应用 项目实施 » [设计模式讨论之]prototype模式 [原型模式]
让LU留住您的每

一天 让LU博客留住您的每一天
2003-11-15 11:49 无双
prototype模式<br />定义<br />就是使用原型实例来指定创建对象的种类 并通过拷贝这些原型来创建新的对象<br /><br />例子:<br /><br />例子如下(书上的迷宫类)<br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--><br />// &amp;nbsp;声明管理原型的类<br />class MazePrototypeFactory&#58;public MazeFactory{<br /> &amp;nbsp; &amp;nbsp;public&#58;<br /> &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &amp;nbsp;声明构造函数,这个函数的参数是一组对象的原型,如Maze对象的原型等<br /> &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;MazePrototypeFactory&#40;Maze*,Wall*,Room*,Door*&#41;;<br /><br /> &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &amp;nbsp;声明根据原型来创建对象的接口<br /> &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;virtual Maze* MakeMaze&#40;&#41; const;<br /> &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;virtual Room* MakeRoom&#40;int &#41;cnost;<br /> &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;virtual Wall* MakeWall&#40;&#41;const;<br /> &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;virtual Door* MakeDoor&#40;Room*,Room*&#41; const;<br /> &amp;nbsp; &amp;nbsp;private&#58;<br /> &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// &amp;nbsp;保存原型对象<br /> &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Maze* _prototypeMaze;<br /> &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Room* _prototypeRoom;<br /> &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Wall* _prototypeWall;<br /> &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Door* _prototypeDoor;<br />};<br /><br /><!--c2--></div><!--ec2--><br /><br />构造函数接口<br /><!--c1--><div class='codetop'>CODE</div><div class='codemain'><!--ec1--><br />// &amp;nbsp;在构造函数中保存原型<br />MazePrototypeFactory&#58;&#58;MazePrototypeFactory&#40;Maze*m,Wall*w,Room*r,Door*d&#41;<br />{<br /> &amp;nbsp; &amp;nbsp;_prototypeMaze = m;<br /> &amp;nbsp; &amp;nbsp;_prototypeRoom = w;<br /> &amp;nbsp; &amp;nbsp;_prototypeWall = r;<br /> &amp;nbsp; &amp;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 />// &amp;nbsp;根据原型来创建对象<br />virtual Maze* MazePrototypeFactory&#58;&#58;MakeMaze&#40;&#41; const<br />{<br /> &amp;nbsp; &amp;nbsp;return _prototypeMaze-&#62;Clone&#40;&#41;;<br />}<br /><br />// &amp;nbsp;根据原型来创建对象,并对对象进行了其它的初始化<br />virtual Door* MazePrototypeFactory&#58;&#58;MakeDoor&#40;Room* r1,Room* r2&#41; const<br />{<br /> &amp;nbsp; &amp;nbsp;Door* door = _prototypeDoor-&#62;Clone&#40;&#41;;<br /> &amp;nbsp; &amp;nbsp;door-&#62;Initalize&#40;r1,r2&#41;;<br /> &amp;nbsp; &amp;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 />这在多数情况下没有问题 但是在有循环引用或其它不支持拷贝的情况下就不适合

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.