大话设计模式-原型模式学习总结

一、概念

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

二、类图这里写图片描述

三、实例之简历

潜复制:被复制对象的所有属性都含有与原来的对象相同的值,而所有对象的引用都仍指向原有的对象。
深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

下面为简历类的浅复制及深复制在原型模式中的应用。

//工作经历类
public class WorkExperience implements Cloneable{
    private String workDate;
    private String company;

    public String getWorkDate() {
        return workDate;
    }
    public void setWorkDate(String workDate) {
        this.workDate = workDate;
    }
    public String getCompany() {
        return company;
    }
    public void setCompany(String company) {
        this.company = company;
    }

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

}
//1、深复制
//具体原型类
public class Resume implements Cloneable{
    private String name;
    private String sex;
    private String age;

    private WorkExperience experience;

    public Resume(String name) throws Exception{
        this.name=name;
        //克隆"工作经历"的数据
        experience=new WorkExperience();
    }

    private Resume(WorkExperience experience) throws Exception{
        this.experience=(WorkExperience) experience.clone();
    }

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

    public void SetWorkExperience(String workDate,String company){
        experience.setWorkDate(workDate);
        experience.setCompany(company);
    }

    public void Display(){
        System.out.println("姓名:"+name+" 性别:"+sex+" 年龄:"+age);
        System.out.println("工作经历: "+experience.getWorkDate()+experience.getCompany());
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Resume obj = null;
        try {
            obj=new Resume(this.experience);
        } catch (Exception e) {
            e.printStackTrace();
        }
        obj.name=this.name;
        obj.sex=this.sex;
        obj.age=this.age;
        return obj;
    }

}
/*
 * 深复制---把引用对象的变量指向复制过的新对象,而不是原有的被应用的对象
 */
 //客户端
public class Show {
    public static void main(String[] args) throws Exception {
        Resume a = new Resume("纳尼");
        a.SetPersonInfo("男", "19");
        a.SetWorkExperience("2018", "xxx");

        Resume b = (Resume) a.clone();
        b.SetWorkExperience("2019", "ttt");

        Resume c = (Resume) a.clone();
        c.SetWorkExperience("2020", "zzz");

        a.Display();
        b.Display();
        c.Display();
        /*
         * 姓名:纳尼 性别:男 年龄:19 工作经历: 2018xxx 
         * 姓名:纳尼 性别:男 年龄:19 工作经历: 2019ttt 
         * 姓名:纳尼 性别:男 年龄:19 工作经历: 2020zzz
         */
    }

}

2、浅复制




public class Resume implements Cloneable{
    private String name;
    private String sex;
    private String age;

    private WorkExperience experience;

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

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

    public void setExperience(String workDate,String company) {
        experience.setWorkDate(workDate);
        experience.setCompany(company);
    }

    public void Display(){
        System.out.println("姓名:"+name+" 性别:"+sex+" 年龄:"+age);
        System.out.println("工作经历: "+experience.getWorkDate()+experience.getCompany());
    }

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

}
/*
 * 浅复制---所有对其他对象的引用都仍然指向原来的对象
 */
public class Show {
    public static void main(String[] args) throws Exception {
        Resume a=new Resume("纳尼");
        a.SetPersonalInfo("男", "19");
        a.setExperience("2018", "xxx");

        Resume b=(Resume) a.clone();
        b.setExperience("2019", "xxx");

        Resume c=(Resume) a.clone();
        c.setExperience("2020", "xxx");

        a.Display();
        b.Display();
        c.Display();
        /*
         * 姓名:纳尼 性别:男 年龄:19工作经历: 2020xxx
         * 姓名:纳尼 性别:男 年龄:19工作经历: 2020xxx
         * 姓名:纳尼 性别:男 年龄:19工作经历: 2020xxx*/

    }

}

四、总结

在简历类案例中,通过浅复制可得到与(原型类)简历类型一致且工作经历一致的简历实例,通过深复制可以得到与(原型类)简历类型一致但工作经历不同的简历实例。
/*浅复制:
* 姓名:纳尼 性别:男 年龄:19工作经历: 2020xxx
* 姓名:纳尼 性别:男 年龄:19工作经历: 2020xxx
* 姓名:纳尼 性别:男 年龄:19工作经历: 2020xxx*/
/*深复制:
* 姓名:纳尼 性别:男 年龄:19 工作经历: 2018xxx
* 姓名:纳尼 性别:男 年龄:19 工作经历: 2019ttt
* 姓名:纳尼 性别:男 年龄:19 工作经历: 2020zzz
*/
“`
此时再来看原型模式的概念:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象便有了更清楚的理解。

Fear not that life shall come to an end,but rather fear that it shall never have a beginning.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值