设计模式-03 原型模式

使用场景
一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑用原型模式拷贝多个对象供调用者使用。即保护性拷贝。

浅拷贝和深拷贝
在clone()方法中把对象的属性也进行拷贝的是深拷贝,如下文代码中的

student.hobbyList = (ArrayList<String>) this.hobbyList.clone();

只是把原对象的值付给拷贝对象的是浅拷贝

Student student = (Student) super.clone();
student.name = this.name;

但是虽然这里的name是浅拷贝。但是拷贝后的student的name属性和原来student的name属性并不会相互影响。

public class Student implements Cloneable {

    String name;

    ArrayList<String> hobbyList = new ArrayList<String>();

    public Student() {

    }

    private void addHobby(String hobby) {
        hobbyList.add(hobby);
    }

    @Override
    protected Object clone() {
        try {
            Student student = (Student) super.clone();
            student.name = this.name;
            student.hobbyList = (ArrayList<String>) this.hobbyList.clone();
            return student;
        } catch (Exception e) {
        }
        return null;
    }

    public static void main(String[] args) {
        Student student = new Student();
        student.name = "张三";
        student.addHobby("唱歌");
        student.addHobby("跳舞");
        student.addHobby("打游戏");
        Student cloneStudent = (Student) student.clone();
        System.out.println("原来的名字:" + student.name);
        System.out.println("克隆的名字:" + cloneStudent.name);

        for (String str : student.hobbyList) {
            System.out.println("原来的爱好:" + str);
        }

        for (String str : cloneStudent.hobbyList) {
            System.out.println("克隆的爱好:" + str);
        }

        cloneStudent.name = "李四";
        cloneStudent.addHobby("看书");
        System.out.println("修改克隆的属性后================");

        System.out.println("原来的名字:" + student.name);
        System.out.println("克隆的名字:" + cloneStudent.name);

        for (String str : student.hobbyList) {
            System.out.println("原来的爱好:" + str);
        }

        for (String str : cloneStudent.hobbyList) {
            System.out.println("克隆的爱好:" + str);
        }

    }
}

打印结果

原来的名字:张三
克隆的名字:张三
原来的爱好:唱歌
原来的爱好:跳舞
原来的爱好:打游戏
克隆的爱好:唱歌
克隆的爱好:跳舞
克隆的爱好:打游戏
修改克隆的属性后================
原来的名字:张三
克隆的名字:李四
原来的爱好:唱歌
原来的爱好:跳舞
原来的爱好:打游戏
克隆的爱好:唱歌
克隆的爱好:跳舞
克隆的爱好:打游戏
克隆的爱好:看书

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值