原型模式

97 阅读1分钟

介绍

用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

使用

public class Prototype {
    public static void main(String[] args) throws CloneNotSupportedException {
        Student student = new Student();
        student.setAge(14);
        student.setName("Tom");

        Score score = new Score();
        score.setScore(123);

        student.setScore(score);

        Student clone = (Student) student.clone();
        //浅拷贝,这里返回true
        System.out.println(clone.getScore() == student.getScore());

        clone.setName("Cat");
        clone.setAge(35);
        clone.getScore().setScore(44);

        System.out.println(student);
        System.out.println(clone);
    }
}
class Score implements Cloneable{
    private Integer score;

    public Integer getScore() {
        return score;
    }

    public void setScore(Integer score) {
        this.score = score;
    }

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

    @Override
    public String toString() {
        return "Score{" +
                "score=" + score +
                '}';
    }
}
class Student implements Cloneable{
    private String name;
    private Integer age;
    private Score score;

    public Score getScore() {
        return score;
    }

    public void setScore(Score score) {
        this.score = score;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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


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

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

注意

  • 实现Cloneable接口,并重写clone方法即可进行拷贝操作
  • java默认的拷贝是浅拷贝。