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

Vla*_*tiy 10 c++ design-patterns

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

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

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

// Usage:
ConcretePrototype proto;
auto protPtr = proto.clone();
Run Code Online (Sandbox Code Playgroud)

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

class Obj
{
public:
    Obj();

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

Obj o;
Obj o2 = o;
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*zok 16

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

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

使用前者来实现后者将是困难的,因为复制构造函数旨在在知道对象的确切实例时使用,而原型在可能存​​在某些接口的任何可能实现时使用并且您只想获取新对象完全相同的实现,而不采用一些奇怪的铸造和检查方法.

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


小智 6

以下是GoF书籍的参考:

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

原型设计模式的示例

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

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

希望您了解这种模式有用的情况.还记得,没有虚拟构造函数.