原型模式的实现较为简单,基类提供Clone虚函数,子类只需实现这个Clone函数即可。
原型模式还有个重要意义:当一个基类指针指向某个子类对象时,这时如果想要拷贝这个子类对象是比较困难的,因为只通过一个基类指针我们不知道该指针究竟指向了什么类型的对象,即无法调用相应的构造函数,通过typeid加switch貌似代价太大,所以可以使用此原型模式。#include <iostream>
struct Animal {
virtual ~Animal() {}
virtual Animal* Clone() = 0;
virtual void ShowName() = 0;
};
struct Tiger : public Animal {
Animal* Clone() override { return new Tiger(); }
void ShowName() override { std::cout << "Tiger" << std::endl; }
};
int main() {
Animal* animal = new Tiger();
animal->ShowName();
Animal* animal_copy = animal->Clone(); // 想要一个和animal完全相同的实例
animal_copy->ShowName();
return 0;
}