原型设计在下面的代码

时间:2018-04-26 07:43:53

标签: c++ c++11

当我在网上学习原型设计时,我得到了一个代码,但它看起来很错误,有人可以检查并确认吗

class Stooge {
public:
 virtual Stooge* clone() = 0;
 virtual void slap_stick() = 0;
};

class Curly : public Stooge {
public:
    Stooge*   clone() { return new Curly; }
    void slap_stick() {
      cout << "Curly: suffer abuse\n"; }
    };

    Stooge* Factory::s_prototypes[] = {
        0, new Larry, new Moe, new Curly
    };
    Stooge* Factory::make_stooge( int choice = 3 ) {
        return s_prototypes[choice]->clone();
    }
make_stooge中的{p> Factory会创建两个对象吗?因为

  • s_prototypes[choice]返回一个对象
  • s_prototypes[choice]->clone()再次返回另一个对象。

2 个答案:

答案 0 :(得分:0)

没有。

Stooge* Factory::s_prototypes[] = {
0, new Larry, new Moe, new Curly
};

这是你创建的第一个对象。

Stooge* Factory::make_stooge( int choice = 3 ) {
return s_prototypes[choice]->clone();
}

此函数克隆现有对象以返回新对象。根据示例代码,这里只创建了一个对象。

答案 1 :(得分:0)

这是一个数组的声明(可能它应该是私有的)

{
    ...
    "_shards": {
        ...
        "failures": [
            {
                "shard": 0,
                "index": "test2",
                "node": "TGUboSt9SweF3KQBKnoVSg",
                "reason": {
                    "type": "illegal_argument_exception",
                    "reason": "no mapping found for field [field1]"
                }
            }
        ]
    },
    "hits": {
        "total": 0,
        "max_score": null,
        "hits": []
    },
    ...
}

注意,我用nullptr替换了0。 它是用对象实例初始化的。

clone()应该制作一个对象的副本。在你的情况下,它没有。而不是原型,你创建了一个简单的工厂。在您的特定情况下,它不是必要的方法,因为您可以将其实现为 Stooge* Factory::s_prototypes[] = { nullptr, new Larry, new Moe, new Curly }; 的复制构造函数(Moe和Larry)。

当要创建的对象类型由原型实例确定时使用它,该实例被克隆以生成新对象。此模式用于:

原型模式用于

  • 避免客户端应用程序中的对象创建者的子类,如工厂方法模式。
  • 避免以标准方式创建新对象的固有成本(例如,使用&#39; new&#39;关键字),当它对于给定的应用程序来说过于昂贵时。

在C ++中,Curly方法的常用内容将是

ConcreteProtoType::clone()

有时需要一些额外的代码来按架构创建新实例。 (调用初始化方法?新表达式将是一个使用内存池的新位置?我们可以在构造函数中执行某些操作,作为对虚方法的调用?)

如果对象不能被浅层复制(如果它可以,为什么我们使用原型?),那就需要定义复制构造函数。