大话设计模式笔记(六)——原型模式

第九章原型模式

在面向对象语言中,解决复制对象而不是复制引用的问题的解决方法是原型模式。

原型模式的UML图

Java中,原型接口是存在的,是Copyable。Clone方法是Object的clone(),不过是protected,使用super.clone()时,必须实现Copyable接口。不然会抛出CloneNotSupportedException异常。

例子,原型模式实现深复制:

现有简历类,简历中有工作经历类,通过原型模式实现简历类的复制。

UML图

简历类

public class Resume implements Cloneable{
    private int id;
    private String name;
    private int age;
    private String sex;
    private WorkExperience workExperience;

    public Resume(Stringname) {
        this.name = name;
        workExperience = new WorkExperience();
    }

    /** getter、setter */

    public void setWorkExperience(StringcomanyName, double workTime) {
        this.workExperience.setCompanyName(comanyName);
        this.workExperience.setWorkTime(workTime);
    }

    public Objectclone() {
        try {
            Resume user = (Resume) super.clone();
            user.workExperience= (WorkExperience) workExperience.clone();
            return user;
        } catch(CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }

}

工作经验类

public class WorkExperience implements Cloneable{
    private StringcompanyName;
    private double workTime;

    /** getter、setter */

    public Objectclone() {
        try {
            return (WorkExperience)super.clone();
        } catch(CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }
}

client类

public class Client {
    public static void main(String[]args) {
        Resume zhangsan = new Resume("张三");
        zhangsan.setId(1);
        zhangsan.setAge(19);
        zhangsan.setWorkExperience("XXXX有限公司", 4);

        Resume lisi = (Resume) zhangsan.clone();
        lisi.setName("李四");
        lisi.setWorkExperience("腾讯", 1);

        System.out.println(zhangsan.getName() + "," + zhangsan.getAge() + "," + zhangsan.getWorkExperience().getCompanyName() + "/0" + zhangsan.getWorkExperience().getWorkTime());
        System.out.println(lisi.getName() + "," + lisi.getAge() + "," + lisi.getWorkExperience().getCompanyName() + "/0" + lisi.getWorkExperience().getWorkTime());
    }
}

总结

原型模式是的作用是用来复制对象的。原型模式赋值时不考虑构造细节,所以它比构造效率高。

原始模式的复制涉及深复制和浅复制。浅复制是只复制对象中的基本数据类型,而引用类型只复制引用,实际指向同一个对象。深复制是复制对象中的所有属性。
经验分享 程序员 微信小程序 职场和发展