原型模式

浅克隆 c++
#include <iostream>
using namespace std;
//向量类
class Vector{
private:
    int *p;
    int len;
public:
    Vector(int len);
    Vector(const Vector &vector);  //拷贝构造函数
    ~Vector();
    int operator[](int i) const { return p[i]; }
    int &operator[](int i){ return p[i]; }
    int length() const { return len; }
};
Vector::Vector(int len): len(len){
    p = (int*)calloc( len, sizeof(int) );
}
//拷贝构造函数
Vector::Vector(const Vector &vector){
    this->len = vector.len;
    this->p = vector.p;
}
Vector::~Vector(){ free(p); }
//打印
void display(const Vector &vector){
    int len = vector.length();
    for(int i=0; i<len; i++){
        if(i == len-1){
            cout<<vector[i]<<endl;
        }else{
            cout<<vector[i]<<", ";
        }
    }
}
int main(){
    Vector v1(10);
    for(int i=0; i<10; i++){
        v1[i] = i;
    }
    Vector v2 = v1;
    v2[6] = 55;
    v2[2] = 20;
    cout<<"浅克隆:"<<endl;
    cout<<"更改copyVector后vector的数据:"<<endl;
    display(v1);
    cout<<"更改copyVector后copyVector的数据:"<<endl;
    display(v2);
    return 0;
}


深克隆 c++
#include <iostream>
using namespace std;
//向量类
class Vector{
private:
    int *p;
    int len;
public:
    Vector(int len);
    Vector(const Vector &vector);  //拷贝构造函数
    ~Vector();
    int operator[](int i) const { return p[i]; }
    int &operator[](int i){ return p[i]; }
    int length() const { return len; }
};
Vector::Vector(int len): len(len){
    p = (int*)calloc( len, sizeof(int) );
}
//拷贝构造函数
Vector::Vector(const Vector &vector){
    this->len = vector.len;
    this->p =  (int*)calloc( this->len, sizeof(int) );
    memcpy( this->p, vector.p, len * sizeof(int) );
}
Vector::~Vector(){ free(p); }
//打印
void display(const Vector &vector){
    int len = vector.length();
    for(int i=0; i<len; i++){
        if(i == len-1){
            cout<<vector[i]<<endl;
        }else{
            cout<<vector[i]<<", ";
        }
    }
}
int main(){
    Vector v1(10);
    for(int i=0; i<10; i++){
        v1[i] = i;
    }
    Vector v2 = v1;
    v2[6] = 55;
    v2[2] = 20;
    cout<<"深克隆:"<<endl;
    cout<<"更改copyVector后vector的数据:"<<endl;
    display(v1);
    cout<<"更改copyVector后copyVector的数据:"<<endl;
    display(v2);
    return 0;
}


浅克隆java:
//Vector.java
package qiankelong;

import java.util.Arrays;

public class Vector implements Cloneable
{
    private int[] array;

    private Attachment attachment=null;

    public Vector()
    {

        this.attachment=new Attachment();
    }

    public Object clone()
    {
        Vector clone=null;
        try
        {
            clone=(Vector)super.clone();
        }
        catch(CloneNotSupportedException e)
        {
            System.out.println("Clone failure!");
        }
        return clone;
    }

    public Attachment getAttachment()
    {
        return this.attachment;
    }

    public void display()
    {
            System.out.println(Arrays.toString(array));
    }

    public int[] getArray() {
        return array;
    }

    public void setArray(int[] array) {
        this.array = array;
    }

}
//Attachment.java
package qiankelong;
public class Attachment
{
    public void download()
    {
        System.out.println("复制向量");
    }
}
//Client.java
package qiankelong;
public class Client
{
    public static void main(String a[])
    {

        Vector vector,copyVector;
        vector=new Vector();
        int[] arr= {2,8,3,6};
        vector.setArray(arr);
        System.out.println("浅克隆示例:");
        copyVector=(Vector)vector.clone();
        System.out.print("vector:");
        vector.display();
        System.out.print("copyVector:");
        copyVector.display();
        System.out.println("vector==copyVector?");
        System.out.println(vector==copyVector);

        System.out.println("vector.getAttachment==copyVector.getAttachment?");
        System.out.println(vector.getAttachment()==copyVector.getAttachment());
    }
}


深克隆Java:
//Vector.java
package shenkelong;
import java.io.*;
import java.util.Arrays;
 
public class Vector implements Serializable
{
    private int[] array;
    private Attachment attachment=null;
     
    public Vector()
    {
        this.attachment=new Attachment();
    }
     
    public Object deepClone() throws IOException, ClassNotFoundException, OptionalDataException
    {
        //将对象写入流中
        ByteArrayOutputStream bao=new ByteArrayOutputStream();
        ObjectOutputStream oos=new ObjectOutputStream(bao);
        oos.writeObject(this);
         
        //将对象从流中取出
        ByteArrayInputStream bis=new ByteArrayInputStream(bao.toByteArray());
        ObjectInputStream ois=new ObjectInputStream(bis);
        return(ois.readObject());
    }
     
    public Attachment getAttachment()
    {
        return this.attachment;
    }
     
    public void display()
    {
            System.out.println(Arrays.toString(array));
    }
 
    public int[] getArray() {
        return array;
    }
 
    public void setArray(int[] array) {
        this.array = array;
    }
}
//Attachment.java
package shenkelong;
import java.io.*;
 
public class Attachment implements Serializable
{
    public void download()
    {
        System.out.println("复制向量");
    }
}
//Client.java
package shenkelong;
public class Client
{
    public static void main(String a[])
    {
        Vector vector,copyVector=null;
         
        vector=new Vector();
        int[] arr= {2,8,3,6};
        vector.setArray(arr);
        System.out.println("深克隆示例:");
         
        try{
            copyVector=(Vector)vector.deepClone();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }  
        System.out.print("vector:");
        vector.display();
        System.out.print("copyVector:");
        copyVector.display();
        System.out.println("vector==copyVector?");
        System.out.println(vector==copyVector);
         
        System.out.println("vector.getAttachment==copyVector.getAttachment?");
        System.out.println(vector.getAttachment()==copyVector.getAttachment());        
    }
}
posted @ 2022-11-05 18:58  华茹  阅读(19)  评论(0)    收藏  举报