(十)原型模式
1. 定义
原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。[DP]
提供ICloneable接口,其中唯一的方法Clone(),只要实现这个接口就可以完成原型模式。
原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。
简单点说就是,实现了一个clone的接口,来从一个对象创建另一个可定制对象。
2. 实例
#include <iostream>
#include <string>
using namespace std;
class Prototype
{
public:
Prototype() = default;
void SetState(string state){ m_state = state; }
string GetState(){ return m_state; }
virtual void show(){
cout << "state is " << m_state << endl;
}
virtual Prototype* Clone() = 0;
private:
string m_state;
};
class PrototypeA :public Prototype
{
public:
PrototypeA() = default;
void show(){
Prototype::show();
cout << endl;
}
Prototype* Clone(){
Prototype* p = new PrototypeA();
p->SetState(this->GetState());
return p;
}
};
int main()
{
Prototype* a = new PrototypeA();
a->SetState("off");
a->show();
Prototype* b = a->Clone();
b->show();
b->SetState("on");
b->show();
delete a;
delete b;
return 0;
}
3. 浅复制和深复制的区别
- 浅复制,被复制对象的所有变量都含有原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象;
- 深复制,把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象;
4. 实践
在实际项目中,有许多struct或者class有拷贝、复制、克隆的需求,原型模式提供了一种思路。
另外还有 std::copy 函数.