原型模式定义:
用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或者相似的新对象。
原型模式的优点:
性能提高:比直接使用new一个对象更加优良;
简化创建对象的过程:使用深拷贝将对象赋值了一份;
原型模式的缺点:
需要为每一个类都配置一个clone方法;
clone方法在内的内部,对已有对象改造时,需要修改代码,违背了开闭原则;
当实现深克隆时,需要编写较为复杂的代码,而且当对象之间存在多重嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆,实现起来会比较麻烦。因此,深克隆、浅克隆需要运用得当。
原型模式抽象基类:ProtoTypeVehicle
class ProtoTypeVehicle
{
public:ProtoTypeVehicle(){m_name &#61; "";std::cout <<"构造车辆对象:" <};
原型对象具体实现类&#xff1a; ProtoType110Car
class ProtoType110Car :public ProtoTypeVehicle
{
public:ProtoType110Car(){std::cout <<"构造110车辆对象" <public:virtual ProtoTypeVehicle *clone(){
#if 0ProtoType110Car *p &#61; new ProtoType110Car();//深克隆自己创建对象*p &#61; *this;if (nullptr !&#61; p){std::cout <<"克隆110车辆对象" <#elsestd::cout <<"克隆110车辆对象" <#endif // 0}
private:};
原型对象具体实现类&#xff1a; ProtoType120Car
class ProtoType120Car :public ProtoTypeVehicle
{
public:ProtoType120Car(){std::cout <<"构造120车辆对象" <public:virtual ProtoTypeVehicle *clone(){
#if 0ProtoType120Car *p &#61; new ProtoType120Car();//深克隆自己创建对象*p &#61; *this;if (nullptr !&#61; p){std::cout <<"克隆120车辆对象" <#elsestd::cout <<"克隆120车辆对象" <#endif // 0}
private:};
主函数&#xff1a;
int main()
{ProtoTypeVehicle *_110Car_1 &#61; new ProtoType110Car("警A0001");_110Car_1->printfInfo();std::cout <<"对象1地址&#xff1a;" <<_110Car_1 <clone();_110Car_2->reName("警A0002");_110Car_2->printfInfo();std::cout <<"对象地址&#xff1a;" <<_110Car_2 <reName("警A0003");_110Car_3->printfInfo();std::cout <<"对象3地址&#xff1a;" <<_110Car_3 <printfInfo();for (size_t i &#61; 0; i <3; i&#43;&#43;){std::cout <}
原型模式的克隆分为浅克隆和深克隆。
- 浅克隆&#xff1a;创建一个新对象&#xff0c;新对象的属性和原来对象完全相同&#xff0c;对于非基本类型属性&#xff0c;仍指向原有属性所指向的对象的内存地址。
- 深克隆&#xff1a;创建一个新对象&#xff0c;属性中引用的其他对象也会被克隆&#xff0c;不再指向原有对象地址。