原型模式(《大话设计模式》):
- 用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象
- 从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
- c++本身是有拷贝构造的,那么原型模式有什么好处呢?
- 我自己感觉,和拷贝构造相比,隐藏了拷贝的细节,把拷贝构造进行了封装
- 下面这个例子,我用了继承和多态,再加上智能指针,用起来给我自己对大的感受就是不用动脑子,我都不需要知道这具体是哪一个子类
- 其实我觉的这个例子可以用装饰模式,懒得写了
#include <iostream> #include <string> #include <memory> using namespace std; class Person { public: string name; int age; Person(string _name, int _age) :name(_name), age(_age) {} virtual ~Person() {} virtual void showMe() { cout << "I am " << name << ", and " << age << endl; } virtual Person *clone() { return new Person(*this); } }; class Boy :public Person { public: Boy(string _name, int _age):Person(_name, _age) {} ~Boy() {} virtual void showMe() override { Person::showMe(); cout << "I am a boy" << endl; } virtual Person *clone() override { return new Boy(*this); } }; class Girl :public Person { public: Girl(string _name, int _age) :Person(_name, _age) {} ~Girl() {} virtual void showMe() override { Person::showMe(); cout << "I am a Girl" << endl; } virtual Person *clone() override { return new Girl(*this); } }; int main() { //创建一个boy a Person *a = new Boy(string("Ming"), 28); a->showMe(); //创建一个Girl b Person *b = new Girl(string("Li"), 28); b->showMe(); //克隆a--不使用原型模式的写法 shared_ptr<Person> cloneA(new Boy(*dynamic_cast<Boy *>(a))); cloneA->showMe(); //克隆b--使用原型模式的写法 shared_ptr<Person> cloneB(b->clone()); cloneB->showMe(); delete b; delete a; return 0; }