设计模式中的原型模型主要是针对构造复杂对象提出来的,当构造函数需要大量的操作时构造一个类的对象会耗费大量的资源。
本文:http://www.cnblogs.com/xudong-bupt/p/3506450.html
1.C++中的解决方案
在C++中默认提供了copy构造函数、copy assignment操作符,可以实现对象的内存拷贝,节省了新构造对象的开销,其中的实现机制就是操作符重载。C++代码如下:
1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 5 class Point{ 6 public: 7 Point(const int _x,const int _y):x(_x),y(_y){} 8 9 int x; 10 int y; 11 }; 12 13 int main(){ 14 Point p1(5,5); 15 Point p2=p1; ///或者Point p2(p1); 16 p2.x=6; 17 18 cout<<"p1.x="<<p1.x<<endl; 19 cout<<"p2.x="<<p2.x<<endl; 20 return 0; 21 }
代码中使用了C++默认提供的copy构造函数或者copy assignment操作符,从内存拷贝新建对象,速度快。
执行结果:
2.java中的解决方案
2.1 Java中没有提供“=”的copy assignment操作符等
Java中的“=”对于对象类型是共享对象的引用,而不是复制对象。对其中一个引用修改数据,其他引用就同时能够看到。如下图所示:
代码如下:
1 public class TestClone{ 2 public static void main(String[] arg){ 3 Point p1=new Point(5,5); 4 5 Point p2=p1; 6 p2.x=10; 7 System.out.println("p1.x="+p1.x); //(10) 8 System.out.println("p2.x="+p2.x); //(10) 9 } 10 } 11 12 class Point{ 13 int x; 14 int y; 15 Point(int _x,int _y){ 16 this.x=_x; 17 this.y=_y; 18 } 19 }
2.2 Java中提供了Cloneable关键字
Java中提供了Cloneable关键字来标示这个对象是可以拷贝的。Cloneable接口中没有一个方法,只起到标示作用。
clone()方法是Object类提供的方法,只用重写“clone()”方法就能实现对象拷贝。
对象拷贝有分为:深拷贝、浅拷贝。看下面的代码:
1 public class TestClone{ 2 public static void main(String[] arg){ 3 Point p1=new Point(5,5); 4 Point p3=(Point) p1.clone(); 5 p3.y=-10; 6 p3.mes[0]=20; 7 System.out.println("p1.y="+p1.y+",p3.y="+p3.y); 8 System.out.println("p1.mes[0]="+p1.mes[0]+",p3.mes[0]="+p3.mes[0]); 9 } 10 } 11 12 class Point implements Cloneable{ 13 int x; 14 int y; 15 int mes[]; 16 Point(int _x,int _y){ 17 this.mes=new int[2]; 18 this.x=_x; 19 this.y=_y; 20 this.mes[0]=_x; 21 this.mes[1]=_y; 22 } 23 24 @Override 25 public Point clone(){ 26 Point tt=null; 27 try{ 28 tt=(Point)super.clone(); 29 //tt.mes=(int[])this.mes.clone(); //深拷贝 30 } 31 catch(Exception e){ } 32 return tt; 33 } 34 }
注释掉第29行执行结果(浅拷贝):
p1.y=5,p3.y=-10
p1.mes[0]=20,p3.mes[0]=20
不注释掉第29行执行结果(深拷贝):
p1.y=5,p3.y=-10
p1.mes[0]=5,p3.mes[0]=20
深拷贝、浅拷贝区别:Java类中除基本类型(包含String)外其他复杂数据类型的拷贝,必须使用深拷贝。数组,其他类对象的拷贝,都要用到深拷贝。
3.注意
学的编程语言多了,就得注意他们之间的不同。
Java和C/C++的“=”是不同的,java中“=”将类对象的引用加1;C++中由于重载操作符“=”,会拷贝类对象。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/11633.html