我试图了解何时应该使用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?
答案 0 :(得分:13)
复制构造函数是该语言的一个元素。
Prototype是一种设计模式,用于根据某些现有实例生成(多态)对象。
使用前者来实现后者是很困难的,因为在知道对象的确切实例时会使用复制构造函数,而在可能有任何可能的实现时使用原型。一些接口,你只想获得完全相同的实现的新对象,而不需要使用一些奇怪的转换和检查方法。
让我们假设你有接口I
和实现A
和B
。在某些时候,您将获得实施i
的对象I
。也许您不想修改它,而是您希望获得新实例,然后对其进行一些修改。当你不知道i
的确切类别时,怎么能实现呢?原型模式是解决该问题的一种方法:I* i2 = i.clone();
。
答案 1 :(得分:6)
以下是GoF书籍的参考资料:
克隆原型的客户不必知道他们的具体子类。客户端永远不需要将克隆的返回值向下转换为所需类型。
在您的示例中,客户端不知道(或无法访问)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。