IT源码网

设计模式之原型模式讲解

developer 2020年10月18日 编程语言 289 0

设计模式中的原型模型主要是针对构造复杂对象提出来的,当构造函数需要大量的操作时构造一个类的对象会耗费大量的资源。

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++中由于重载操作符“=”,会拷贝类对象。

发布评论
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Java使用jxl.jar包写Excel文件的最适合列宽问题基本实现讲解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。