ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

设计模式 05 原型模式

2022-07-21 23:06:42  阅读:173  来源: 互联网

标签:name 05 对象 clone 原型 Student 拷贝 设计模式 student1


参考源

https://www.bilibili.com/video/BV1mc411h719?p=5&vd_source=299f4bc123b19e7d6f66fefd8f124a03


原型模式(Prototype Pattern)属于创建型模式

原型模式实际上就是对象的拷贝。

原型模式使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。

也就是说,原型对象作为模板,通过克隆操作,来产生更多的对象,就像细胞的复制一样。

原型模式的拷贝分为浅拷贝深拷贝

浅拷贝

对于类中基本数据类型,会直接复制值给拷贝对象。

对于引用类型,只会复制对象的地址,而实际上指向的还是原来的那个对象。

// 基本类型浅拷贝
int a = 10;
int b = a;
// 输出:true
System.out.println(a == b);

// 引用类型浅拷贝,拷贝的仅仅是对上面对象的引用
Object o = new Object();
Object k = o;
// 输出:true
System.out.println(o == k);

深拷贝

无论是基本类型还是引用类型,深拷贝会将引用类型的所有内容,全部拷贝为一个新的对象,包括对象内部的所有成员变量,也会进行拷贝。

在 Java 中,就可以实现 Cloneable 接口提供的拷贝机制,来实现原型模式:

1、定义实体类实现 Cloneable 接口

/**
 * 用户
 * <p>注意需要实现 Cloneable 接口
 */
public class Student implements Cloneable {

    String name;

    public Student(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    /**
     * 提升clone方法的访问权限
     * @return 对象
     * @throws CloneNotSupportedException 不支持克隆异常
     */
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}

2、来看看克隆的对象是不是原来的对象

Student student0 = new Student();
Student student1 = (Student) student0.clone();
System.out.println(student0);
System.out.println(student1);

可以看到,通过 clone() 方法克隆的对象并不是原来的对象,我们来看看如果对象内部有属性会不会一起进行克隆:

public class Student implements Cloneable{
    
    String name;

    public Student(String name){
        this.name = name;
    }
    
    public String getName() {
        return name;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}
Student student1 = new Student("程序航");
Student student2 = (Student) student1.clone();
// 输出:true
System.out.println(student1.getName() == student2.getName());
// 输出:false
System.out.println(student1 == student2);

可以看到,虽然 Student 对象成功拷贝,但是其内层对象并没有进行拷贝,依然只是对象引用的复制。

所以 Java 为我们提供的 clone 方法只会进行浅拷贝。那么如何才能实现深拷贝呢?

深拷贝

1、对成员变量也进行拷贝

@Override
public Object clone() throws CloneNotSupportedException {   
    Student student = (Student) super.clone();
    // 这里我们改进一下,针对成员变量也进行拷贝
    student.name = new String(name);
    // 成员拷贝完成后,再返回
    return student;   
}

2、再执行上述的代码

Student student1 = new Student("程序航");
Student student2 = (Student) student1.clone();
// 输出:false
System.out.println(student1.getName() == student2.getName());
// 输出:false
System.out.println(student1 == student2);

可以看到, Student 对象和其中的属性 name 都进行了拷贝,是完全不一样的对象了。

这样就是拷贝生成了一个全新的对象,也就是深拷贝了。

标签:name,05,对象,clone,原型,Student,拷贝,设计模式,student1
来源: https://www.cnblogs.com/codesail/p/16503945.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有