zoukankan      html  css  js  c++  java
  • 设计模式之原型模式

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

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

  • 相关阅读:
    python json.dumps() json.dump()的区别
    geopy 在python中的使用
    socket技术详解(看清socket编程)
    数据结构之各种数据结构插入、删除、查找的时间复杂度
    数组查找的时间复杂度正确表述
    各种排序算法时间复杂度
    MySQL将一张表的某些列数据,复制到另外一张表,并且修改某些内容
    Java虚拟机学习
    Java虚拟机学习
    java集合框架05——ArrayList和LinkedList的区别
  • 原文地址:https://www.cnblogs.com/xudong-bupt/p/3506450.html
Copyright © 2011-2022 走看看