原型设计模式

package design;

public class Student implements Cloneable {
    private String name;
    private int age;
    private String sex;

    public Student() {
    }

    public Student(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Student s = null;
        try {
            s = (Student) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
        }
        return s;
    }
}
 Student student = new Student("Name",15,"man");
        List<Student> list=new ArrayList<>(10);
        //利用传统的方式
        for (int i = 0; i < 10; i++) {
            student.setAge(i);
            list.add(student);
        }
        for (Student student1 : list) {
            System.out.print(student.getAge()+"|");
        }

输出结果:

9|9|9|9|9|9|9|9|9|9|

利用浅克隆的方式:

Student student = new Student("Name",15,"man");
        List<Student> list=new ArrayList<>(10);
        //利用传统的方式
        for (int i = 0; i < 10; i++) {
            Student s1= (Student) student.clone();
            s1.setAge(i);
            list.add(s1);
        }
        for (Student student1 : list) {
            System.out.print(student1.getAge()+"|");
        }

输出结果:

0|1|2|3|4|5|6|7|8|9|

本例中用的是浅克隆的方式 ,基本数据类型和String类型的变量都可以直接复制其值,但是引用数据类型不能复制,如果对象中有引用数据类型,它实际上只是将内存地址复制下来了,要想实现真正的引用数据类型的复制,要用到深克隆的方式。
深克隆有两种方式:
第一种是重写 object的clone方法
第二种是利用序列化。
但是在实际的开发中,我们推荐使用序列化的方式来完成深克隆。

package design;

import java.io.*;

public class School {
    private String schoolName;
    private Student student;

    public School(String schoolName, Student student) {
        this.schoolName = schoolName;
        this.student = student;
    }

    public School() {
    }

    public String getSchoolName() {
        return schoolName;
    }

    public void setSchoolName(String schoolName) {
        this.schoolName = schoolName;
    }

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }

    @Override
    public String toString() {
        return "School{" +
                "schoolName='" + schoolName + '\'' +
                ", student=" + student +
                '}';
    }

    //提供深克隆的方法
    public Object deepCopy() {
        //创建流对象、
        //输出流
        ByteArrayOutputStream bos = null;
        //对象输出流
        ObjectOutputStream oos = null;
        //输入流
        ByteArrayInputStream bis = null;
        //对象输入流
        ObjectInputStream ois = null;

        //第一步  序列化操作

        try {
            bos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bos);
            //把当前对象以对象流的方式输出
            oos.writeObject(this);
            //反序列化
            bis = new ByteArrayInputStream(bos.toByteArray());
            ois = new ObjectInputStream(bis);
            School  school = (School) ois.readObject();
            return school;
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
            return null;
        }finally {
            //开闭流
            try {
                bos.close();
                oos.close();
                bis.close();
                ois.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
           
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常感谢您的提问!以下是一个使用原型设计模式实现深拷贝的示例代码: ``` class Prototype { public: virtual Prototype* clone() = 0; }; class ConcretePrototype : public Prototype { public: ConcretePrototype(int value) : m_value(value) {} Prototype* clone() override { return new ConcretePrototype(m_value); } int getValue() const { return m_value; } private: int m_value; }; int main() { ConcretePrototype* original = new ConcretePrototype(42); ConcretePrototype* clone = dynamic_cast<ConcretePrototype*>(original->clone()); std::cout << "Original value: " << original->getValue() << std::endl; std::cout << "Clone value: " << clone->getValue() << std::endl; delete original; delete clone; return 0; } ``` 在这个示例中,我们定义了一个 `Prototype` 接口,其中包含了一个 `clone()` 方法,用于创建一个与原型对象相同的新对象。然后,我们实现了一个具体的原型类 `ConcretePrototype`,其中包含了一个整型成员变量 `m_value`,并重写了 `clone()` 方法,返回一个新的 `ConcretePrototype` 对象。最后,我们在 `main()` 函数中创建了一个原型对象 `original`,并通过调用 `clone()` 方法创建了一个新的克隆对象 `clone`。 需要注意的是,这里的深拷贝只是一个简单的示例,实际上在实现深拷贝时需要考虑对象的所有成员变量,并递归地进行拷贝。此外,还需要注意内存管理,确保在不需要使用对象时及时释放内存。 希望这个示例能够帮助您理解原型设计模式和深拷贝的实现方式。如果您有任何问题或需要进一步的帮助,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值