原型(设计模式)

package 设计模式.原型模式.廖雪峰;

import java.util.Arrays;
import java.util.Objects;

/**
 * @author chenjie
 * @date 2021/6/2-9:34
 */
public class Demo {
    public static void main(String[] args) {
        String[] original = {"Apple","Pear","Banana"};
        /*
        * public static char[] copyOf(char[] original, int newLength)
        *       复制指定的数组,截取或用 null 字符填充,以使副本具有指定的长度
        *       original - 要复制的数组
        *       newLength - 要返回的副本的长度
        * */
        String[] copy = Arrays.copyOf(original,original.length);
        System.out.println(Arrays.toString(copy));

        Student stu = new Student();
        stu.setId(123);
        stu.setName("Bob");

        Student stu1 = (Student) stu.clone();
        System.out.println(stu1 == stu);
        System.out.println(stu1);
        System.out.println(stu1.equals(stu));

    }
}

class Student implements Cloneable{
    public Student() {
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return id == student.id && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }

    /*
* 要克隆一个对象,这个类必须实现 Cloneable 接口
* 还要 重写 Object类中的 clone() 方法
* protected Object clone()
*   创建并返回此对象的一个副本:
*       x.clone() != x
*       x.clone().getClass()  == x.getClass()
*       x.clone().equals(x)
*
* 如果此对象的类不能实现接口 Cloneable , 则会抛出 CloneNotSupportedException
* 。。
*  这个方法执行的是该对象的 “浅表复制” ,而不是 “深层复制” 操作
* Object 类本身不实现Cloneable, 所以在类为 Object 的对象上调用 clone将会导致在运行时抛出异常
* */
    private int id;
    private String name;

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

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

    public Object clone() { //  Object 中的 clone 方法 返回的是 Object类型,需要强转类型
        Student stu = new Student();
        stu.id = this.id;
        stu.name = this.name;
        return stu;
    }
    /*
    * 原型模式,更好的方式是定义一个 copy() 方法,返回明确的类型:
    *    而不是调用 Object 的 clone() 方法
    * */
    public Student copy() {
        Student stu = new Student();
        stu.id = this.id;
        stu.name = this.name;
        return stu;
    }
    /*
    * 原型模式应用不是很广泛,因为很多实例会持有类似文件,Socket资源,而这些资源是无法复制给另一个对象共享的,只有存储简单类型
    * 的“值” 对象可以复制
    * 小结:
    *       原型模式是根据一个现有对象实例复制出一个新的实例,复制出的类型和属性与原实例相同
    * */
}

引用:https://www.liaoxuefeng.com/wiki/1252599548343744/1281319195639841

上一篇:torch安装


下一篇:gitee和git结合使用