在原型设计模式中,抽象基类的克隆方法实现如下
/* From Wikipedia */
class Prototype
{
public:
virtual ~Prototype() { }
virtual Prototype* clone() const = 0;
};
class ConcretePrototype : public Prototype
{
...
virtual ConcretePrototype* clone() const
{
return new ConcretePrototype(*this);
}
};
客户端创建一个对象,然后调用clone()方法来创建对象的副本
新的ConcretePrototype(* this)比新的ConcretePrototype()便宜吗?
答案 0 :(得分:1)
你误解了clone()
的目的。
这是一个“虚拟副本构造函数”。
构造函数实际上不能是虚拟的(甚至不是复制构造函数)。因此,解决方案是使用一种方法,您可以调用已经拥有的对象进行精确复制。
克隆的副本有自己的生命周期,因此可以安全地销毁原始文件。
通常,您会希望实现类具有私有或受保护的复制构造函数,因此您无法直接调用它。
您甚至不必知道要克隆的对象的类型。并注意“共变”返回类型。
我不知道你的意思是“更便宜”。如果你为你的类实现了一个拷贝构造函数,它通常应该至少同样有效,并且通常比创建类的空实例然后复制到它中更有效。
答案 1 :(得分:0)
您应该在此模式中使用copy c-tor
,因为它是模式的意义。
但在其他情况下 - 所有这些都取决于default
构造函数和copy-constructor
中的操作。
答案 2 :(得分:0)
如果我理解你的问题,请给出代码:
ConcretePrototype original;
{some code}
ConcretePrototype copy1;
copy1 = *orignal.clone();
ConcretePrototype copy2(original);
copy1
的创建成本高于copy2
。我能看到您的唯一方法是将default c-tor
与copy c-tor
进行比较,并在一个代码示例中使用克隆。
最有可能是的。多少?很难说。 默认构造函数可能以创建浅表副本的方式实现,因此开销很小。