GoF实现了Prototype模式

时间:2011-08-30 13:34:12

标签: c++ design-patterns prototype-pattern

(这个问题更适合有权访问该书的人,否则很难将其纳入上下文中)

我一直在阅读GoF的'设计模式'一书,在'Creational Patterns-> Prototype->示例代码'下有一句让我感到困惑的句子(第124页)。

在页面底部附近有BombedWall的实现,据我所知,它是一个具体的原型,因为它继承自Wall,并重新定义了Clone()虚函数。 BombedWall还定义了另一个方法HasBomb(),使用常规Wall接口的任何客户端都不知道。

BombedWall(原型客户端)中MazePrototypeFactory存储的唯一方式是Wall*(从BombedWall::Clone返回),这是唯一的方法HasBomb()之后,根据我的理解,是Wall*BombedWall*(动态或静态,取决于我是否知道类型),然后我可以访问HasBomb()方法。

这对我来说似乎都很好;但后来以后作者说(同一页,最后一句,第二段):

  

“客户永远不应该将Clone的返回值转发给。{   所需类型“

什么?那我该如何到达HasBomb()

我一定错过了什么......

2 个答案:

答案 0 :(得分:1)

我给出了一个答案,现在完全改写了它:)

基本上,MazePrototypeFactory只知道它可以使用的基类。它不知道你将要做的任何子类,但它仍然应该能够将任何可能的子类放入迷宫中。

该模式基本上确保MazeFactory将获得一个它理解的类型的指针Wall,而不是因为需要修改MazeFactory才能生成所有子类的对象。

MazeFactory是第124页提到的客户端。为了构建迷宫,它不需要了解HasBomb。

答案 1 :(得分:0)

我的猜测是,此方法仅用于指示BombedWall是具有扩展公共接口的不同类。 Hovewer,此接口未在示例的上下文中使用:迷宫构建算法不区分墙的类型,而其他子系统(例如,渲染引擎)可能会这样做。