java 设计模式 原型模式 自己实现自己的拷贝逻辑

原型模式在创建对象副本时提供了一种更简洁的方式,避免重复赋值导致的可读性和错误风险。文章介绍了如何使用原型模式进行浅复制和深复制,以优化代码结构并确保数据一致性。
摘要由CSDN通过智能技术生成

原型模式,在笔者理解看来就是克隆,当我们在创建第一个对象时,已经给对象赋值完毕,此时我们需要一个当前对象的副本,如果没有原型模式,我们会再次创建一个对象,然后后二次赋值,保证两个对象完全一致,

这样我们的代码可读性就比较差,而且稍不留神copy错了麻烦就大了了,此时我们如果了解原型模式,就能够美化我们的代码,看起来够整洁,而且也不会出错。

原型模式说明
浅克隆只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,
还是指向原生对象的内部元素地址
深度克隆深复制把要复制的对象所引用的对象都复制了一遍

 浅复制

/**
 *  简历对象
 */
public class Resume implements Cloneable{

    private String name;

    private String age;

    private String company;

    public Resume() {
    }

    public Resume(String name, String age) {
        this.name = name;
        this.age = age;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Resume resume = (Resume) super.clone();
        return resume;
    }

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

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

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

}

/**
 * 客户端
 */
public class Test {

    public static void main(String[] args) throws CloneNotSupportedException {
        Resume resume = new Resume("小菜", "25");
        resume.setCompany("XXX-公司");
        Resume resume1 = (Resume) resume.clone();
        resume1.setCompany("AAA-公司");
        System.out.println(resume.getName());
        System.out.println(resume.getCompany());
        System.out.println(resume1.getName());
        System.out.println(resume1.getCompany());
    }
}

小菜
XXX-公司
小菜
AAA-公司

 深复制

/**
 *  简历对象
 */
public class Resume implements Cloneable{

    private String name;

    private String age;

    private WorkExperience workExperience;

    public Resume() {
        workExperience = new WorkExperience();
    }

    public Resume(String name, String age) {
        this.name = name;
        this.age = age;
        workExperience = new WorkExperience();
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Resume resume = (Resume) super.clone();
        resume.setWorkExperience((WorkExperience) this.workExperience.clone());
        return resume;
    }

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

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

    public WorkExperience getWorkExperience() {
        return workExperience;
    }

    public void setWorkExperience(WorkExperience workExperience) {
        this.workExperience = workExperience;
    }
}

/**
 * 客户端
 */
public class Test {

    public static void main(String[] args) throws CloneNotSupportedException {
        Resume resume = new Resume("小菜", "25");
        resume.getWorkExperience().setCompany("XXX-公司");

        Resume resume1 = (Resume) resume.clone();
        resume1.getWorkExperience().setCompany("AAA-公司");
        System.out.println(resume.getName());
        System.out.println(resume.getWorkExperience().getCompany());
        System.out.println(resume1.getName());
        System.out.println(resume1.getWorkExperience().getCompany());
    }
}

小菜
XXX-公司
小菜
AAA-公司

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值