(十九)设计模式-原型模式

1、定义

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

2、使用场景

简历的复印,拷贝所有简历上的内容,复印到其他A4纸上。

3、代码结构UML图

(十九)设计模式-原型模式
简历:具体原型类,实现一个克隆自身的操作;
工作经历:一个普通的类,为了实现深复制,实现ICloneable接口。

4、类的实现

(1)、Resume(简历类)
public class Resume implements Cloneable {
    private String name;
    private String sex;
    private String age;
    private WorkExperience work;

    public Resume(String name) {
        this.name = name;
        work = new WorkExperience();
    }

    private Resume(WorkExperience work) throws CloneNotSupportedException {
        this.work = (WorkExperience) work.clone();//深复制
//        this.work = work;//浅复制
    }

    public void setPersonInfo(String sex, String age) {
        this.sex = sex;
        this.age = age;
    }

    public void setWorkExperience(String workDate, String company) {
        this.work.setWorkDate(workDate);
        this.work.setCompany(company);
    }

    public void display() {
        System.out.println(name + " " + sex + " " + age);
        System.out.println(work.getWorkDate() + " " + work.getCompany());
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Resume resume = new Resume(this.work);
        resume.name = this.name;
        resume.sex = this.sex;
        resume.age = this.age;
        return resume;
    }
}
(2)、WorkExperience (工作经历类)
public class WorkExperience implements Cloneable{
    private String workDate;
    private String company;

    public String getCompany() {
        return company;
    }

    public void setCompany(String company) {
        this.company = company;
    }

    public String getWorkDate() {
        return workDate;
    }

    public void setWorkDate(String workDate) {
        this.workDate = workDate;
    }

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

5、客户端调用

public static void main(String[] args) {
        Resume a = new Resume("小明");
        a.setPersonInfo("男","29");
        a.setWorkExperience("1998-2000","XX公司");

        Resume b = null;
        try {
            b = (Resume) a.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        b.setWorkExperience("1998-2006","YY公司");

        Resume c= null;
        try {
            c = (Resume) a.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        c.setWorkExperience("1998-2003","ZZ企业");

        a.display();
        b.display();
        c.display();
    }
输出:

(十九)设计模式-原型模式

6、总结

实现深复制时需要在对应类的引用对象实现clone方法;
浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。使用场景多。
原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。
集成ICloneable接口,实现clone发放就可以完成原型模式。
一般在初始化的信息不发生变化的情况下 ,克隆是最好的办法。这既隐藏了对象创建的细节,又对性能是大大的提高。
不要重新初始化对象,而是动态地获得对象运行时的状态。


参考:《大话设计模式》

(十九)设计模式-原型模式(十九)设计模式-原型模式 James-Tom 发布了42 篇原创文章 · 获赞 6 · 访问量 5万+ 私信 关注
上一篇:MIT 403– Network Administration Lab 6


下一篇:LeetCode 181. Employees Earning More Than Their Managers (sql)