原型模式

概述

通过拷贝原型创建新的对象。

在Java中有一个Cloneable接口,只有一个clone方法,实现它即可。

举例

生成简历

clone方法会抛出CloneNotSupportedException,为了代码简单省略。

class Resume implements Cloneable{
    private String name;
    private int sex;
    WorkExperience work;
    @Override
    protected Object clone(){
        return super.clone();
    }
}

class WorkExperience{
    private String company;
    private String position;
}

//客户端
Resume a = new Resume();
a.setName("a");
a.setSex(1);
a.setWorkExperience("A","Java");

Resume b = a.clone();
b.setWorkExperience("B","C++");

分析

直接通过克隆生成新的对象,无需重新初始化,也隐藏了创建的细节。

不过存在一个问题就是浅拷贝与深拷贝,上面例子中WorkExperience是引用类型,对它的拷贝只停留在引用,而引用指向的对象没有拷贝,也就是说a、b两者都指向了同一个对象,所以最后打印出来的两份简历都是("B","C++")。

实现深拷贝(此处仅一层,多层较复杂,需要小心处理)

class WorkExperience implements Cloneable{
    ...
    @Override
    protected Object clone(){
        return super.clone();
    }
}
class Resume implements Cloneable{
    ...
    private Resume(WorkExperience work){
        this.work = (WorkExperience)work.clone();
    }
    @Override
    protected Object clone(){
        Resume obj = new Resume(this.work);
        obj.setName(this.name);
        obj.setSex(this.sex);
        return obj;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值