| 作者 |
内容 |
| ltxd |
关于模式prototype,
兄弟我有个地方就是不明白
Prototype中的clone方法的实现我觉得挺奇怪的,按照用这个模式的动机是动态装载,为什么非得要实现什么deep
copy 或shallow copy, 照我的理解实现这个方法的类new
一个它自己不就得了.其实我觉得clone这个名字就不对,应该叫newinstance之类的,
免得误解.
请哪们高手指点一下
谢谢! |
| 02/04/09 16:53 |
酷帖! 臭帖! 回复 |
| 酷帖评价: 臭帖评价: |
| 返回页首 |
|
| idlecrook |
回复:
关于模式prototype, 兄弟我有个地方就是不明白
设计模式我也刚刚开始看,帮不了你 |
| 02/04/10 08:56 |
酷帖! 臭帖! 回复 |
| 酷帖评价: 臭帖评价: |
| 返回页首 |
|
| liyonghai@163.net |
回复:
关于模式prototype, 兄弟我有个地方就是不明白
我也是不懂,但可以聊聊。
首先,clone 和 new是大大的不同的。
再次,prototype
样式可以让使用者不需要具有类的观念(这在将来会很有用)
,使用者可以通过创建一个prototype来生成所要得对象,而不是去重新new
a class.
prototype样式想法很好,不过我觉得目前国内可能很少有系统用的上。 |
| 02/04/10 09:21 |
酷帖! 臭帖! 回复 |
| 酷帖评价: 臭帖评价: |
| 返回页首 |
|
| joy_wind |
首先,clone和new
有一个最大的区别
在面向对象的环境里,在你new一个对象时,你必须在开发时期就要知道这个对象的类型比如new
Dog()。但是clone是不一样的,一个Animal的变量可以通过克隆的方法获得一个Dog的实例,如果Dog继承自Animal并且override了clone方法,
不是吗?通过pototype系统具有了在运行期决定类型的能力。
我隐约感到这种设计为象java这样的强类型语言提供的收益并不大,这一点原作者也提到了。因为我不用c++,所以对这种设计所带来的好处没有切身体会。 |
| 02/04/10 10:23 |
酷帖! 臭帖! 回复 |
| 酷帖评价: 臭帖评价: |
| 返回页首 |
|
| ltxd |
可能兄台误解我的意思了
我当然知道prototype是实现了在运行时实例化类,我的意思是在clone方法中只是简单地return
new MYCLASS就得了,干嘛非得要实现什么copy,如下
class CAbstracPrototype
{
public:
virtual CAbstracPrototype * clone();
};
class CConcretePrototype1:public CAbstracPrototype
{
public:
virtual CConcretePrototype1 * clone()
{
return CConcretePrototype1;
}
};
也就是如上所示,在CConcretePrototype1中clone实现就如上所示就可以了,为什么非得实现什么深copy或浅copy.
而且我认为clone 这个函数的名字就没有取对,应该取为NewInstance就可以了.
不管怎么样,谢谢你! |
| 02/04/10 15:03 |
酷帖! 臭帖! 回复 |
| 酷帖评价: 臭帖评价: |
| 返回页首 |
|
| huangke |
回复:
关于模式prototype, 兄弟我有个地方就是不明白
我想是因为new创建的是一个初始的对象,对象的属性为初始值。
clone创建的是一个已有对象的克隆,新对象的属性值也被完整克隆。 |
| 02/04/10 15:29 |
酷帖! 臭帖! 回复 |
| 酷帖评价: 臭帖评价: |
| 返回页首 |
|
| joy_wind |
回复:
可能兄台误解我的意思了
我又看了一下原著中的prototype模式的例子代码,它的clone方法的实现就是像你所说的返回了一个new
instance ,没错呀!以下是他的两个实现:
Door* Door::Clone () const {
return new Door(*this);
}
Wall* BombedWall::Clone () const {
return new BombedWall(*this);
}
在第二个实现中,子类重载的clone方法返回了一个父类的指针,这就是prototype模式的关键,“它使特殊的子类对客户类不可知。”(翻译的蹩脚了点,不好意思,嘻嘻
:-( |
| 02/04/10 18:03 |
酷帖! 臭帖! 回复 |
| 酷帖评价: 臭帖评价: |
|