【问题标题】:What's the difference between Prototype design pattern and copy constructor in C++C ++中的原型设计模式和复制构造函数有什么区别
【发布时间】:2016-06-26 15:38:31
【问题描述】:

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

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?

【问题讨论】:

  • 代码class ConcretePrototype必须由: public Prototype代码扩展
  • @πάνταῥεῖ 一个是灰色的。另一个,如果你有任何品味的话,不是。 :)

标签: c++ design-patterns


【解决方案1】:

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

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

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

假设您有接口I 和实现AB。在某些时候,你会得到对象i 实现I。也许您不想修改它,而是更愿意获取新实例,然后对其进行一些修改。当您不知道i 的确切类别时,如何实现?原型模式是该问题的一种解决方案:I* i2 = i.clone();

【讨论】:

  • 是的,这真是一个很好的解释。谢谢!
  • 这在处理不可变类型时非常有用。每次,您想要更改一个字段,您都必须从第一个类型克隆创建一个新类型,然后应用更改。
【解决方案2】:

这是来自 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.
}

希望您了解这种模式有用时的情况。还要记住,有no virtual constructor

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    相关资源
    最近更新 更多