C ++中Prototype设计模式和复制构造函数之间的区别是什么

时间:2016-03-11 11:44:20

标签: c++ design-patterns

我试图了解何时应该使用Prototype设计模式。 以下是我理解的原型示例:

class Prototype
{
public:
    virtual Prototype* clone() = 0;
...
};

class ConcretePrototype : public Prototype
{
public:
    Prototype* clone() override { ... }
};

// Usage:
ConcretePrototype proto;
auto protPtr = proto.clone();

问题在哪里: 为什么这比这更好:

class Obj
{
public:
    Obj();

    Obj(const Obj&);
    Obj& operator = (const Obj& other);
};

Obj o;
Obj o2 = o;

那我什么时候应该使用Prototype?

2 个答案:

答案 0 :(得分:13)

复制构造函数是该语言的一个元素。

Prototype是一种设计模式,用于根据某些现有实例生成(多态)对象。

使用前者来实现后者是很困难的,因为在知道对象的确切实例时会使用复制构造函数,而在可能有任何可能的实现时使用原型。一些接口,你只想获得完全相同的实现的新对象,而不需要使用一些奇怪的转换和检查方法。

让我们假设你有接口I和实现AB。在某些时候,您将获得实施i的对象I。也许您不想修改它,而是您希望获得新实例,然后对其进行一些修改。当你不知道i的确切类别时,怎么能实现呢?原型模式是解决该问题的一种方法:I* i2 = i.clone();

答案 1 :(得分:6)

以下是GoF书籍的参考资料:

  

克隆原型的客户不必知道他们的具体子类。客户端永远不需要将克隆的返回值向下转换为所需类型。

Example of Prototype design pattern

在您的示例中,客户端不知道(或无法访问)ConcretePrototype

// Usage:
SomeMethod(PrototypeInterface iproto) // Thanks Prototype pattern
{
  // ConcretePrototype proto;     
  auto protPtr = iproto.clone(); // Gets correct object without calling concrete object's constructor explicitly.
}

希望您了解此模式有用的情况。还记得,有no virtual constructor