原型模式

原型模式:用原型实例指定创建指定对象的种类,并且通过复制这些原型创建新的对象,同时又能保证性能。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。

注意:如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但是不复制引用的对象,因此,原始对象及其复本引用同一对象。

潜复制:被复制对象的所有变量都含有原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。

深复制:把引用对象的变量指向复制过来的新对象,而不是原有的被引用的对象;

潜复制实例UML图

深复制实例UML图:

潜复制代码:

/**
 * @author Shuyu.Wang
 * @package:com.shuyu.prototype
 * @description:
 * @date 2018-11-16 23:11
 **/
@Data
public class WorkExperience {
    private String workDate;
    private String company;
}





/**
 * @author Shuyu.Wang
 * @package:com.shuyu.prototype
 * @description:原型类,实现Cloneable,重写clone(),实现浅复制
 * @date 2018-11-16 23:05
 **/
@Slf4j
public class Resume implements Cloneable{
    private String name;
    private String sex;
    private String age;
    private WorkExperience workExperience;
    public Resume(String name){
        this.name=name;
        workExperience=new WorkExperience();
    }

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

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

    public void show(){
        log.info("name="+name,",sex="+sex,",age="+age);
        log.info("company="+workExperience.getCompany(),"workDate="+workExperience.getWorkDate());
    }

    @Override
    public Object clone() {
        Object clone = null;
        try {
            clone = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return clone;
    }

}

深复制代码:

/**
 * @author Shuyu.Wang
 * @package:com.shuyu.prototype
 * @description:
 * @date 2018-11-16 23:11
 **/
@Data
public class WorkExperience2 implements Cloneable{
    private String workDate;
    private String company;

    @Override
    public Object clone() {
        Object clone = null;
        try {
            clone = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return clone;
    }
}









/**
 * @author Shuyu.Wang
 * @package:com.shuyu.prototype
 * @description:原型类,实现Cloneable,重写clone(),实现深复制
 * @date 2018-11-16 23:05
 **/
@Slf4j
public class Resume2 implements Cloneable{
    private String name;
    private String sex;
    private String age;
    private WorkExperience2 workExperience;
    public Resume2(String name){
        this.name=name;
        workExperience=new WorkExperience2();
    }

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

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

    public void show(){
        log.info("name="+name,",sex="+sex,",age="+age);
        log.info("company="+workExperience.getCompany(),"workDate="+workExperience.getWorkDate());
    }

    @Override
    public Object clone() {
        Resume2 clone = null;
        try {
            clone = (Resume2)super.clone();
            clone.workExperience=(WorkExperience2) workExperience.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return clone;
    }

}

测试代码:

@RunWith(SpringRunner.class)
@SpringBootTest
public class PrototypeApplicationTests {

	@Test
	public void clone1() {
		Resume resume=new Resume("测试1");
		resume.setPersonInfo("男","25");
		resume.setWorkExperience("2016-2017","台达");

		Resume resume1=(Resume)resume.clone();
		resume1.setWorkExperience("2017-2018","百度");

		Resume resume2=(Resume)resume.clone();
		resume2.setWorkExperience("2018-2019","阿里");
		resume.show();
		resume1.show();
		resume2.show();

	}


	@Test
	public void clone2() {
		Resume2 resume=new Resume2("测试1");
		resume.setPersonInfo("男","25");
		resume.setWorkExperience("2016-2017","台达");

		Resume2 resume1=(Resume2)resume.clone();
		resume1.setWorkExperience("2017-2018","百度");

		Resume2 resume2=(Resume2)resume.clone();
		resume2.setWorkExperience("2018-2019","阿里");

		resume.show();
		resume1.show();
		resume2.show();
	}

}

 

 

运行结果如下:

2018-11-16 23:40:51.859  INFO 44132 --- [           main] com.shuyu.prototype.Resume               : name=测试1
2018-11-16 23:40:51.859  INFO 44132 --- [           main] com.shuyu.prototype.Resume               : company=阿里
2018-11-16 23:40:51.859  INFO 44132 --- [           main] com.shuyu.prototype.Resume               : name=测试1
2018-11-16 23:40:51.859  INFO 44132 --- [           main] com.shuyu.prototype.Resume               : company=阿里
2018-11-16 23:40:51.859  INFO 44132 --- [           main] com.shuyu.prototype.Resume               : name=测试1
2018-11-16 23:40:51.859  INFO 44132 --- [           main] com.shuyu.prototype.Resume               : company=阿里

 

 

2018-11-16 23:40:51.859  INFO 44132 --- [           main] com.shuyu.prototype.Resume               : name=测试1
2018-11-16 23:40:51.859  INFO 44132 --- [           main] com.shuyu.prototype.Resume               : company=阿里
2018-11-16 23:40:51.859  INFO 44132 --- [           main] com.shuyu.prototype.Resume               : name=测试1
2018-11-16 23:40:51.859  INFO 44132 --- [           main] com.shuyu.prototype.Resume               : company=阿里
2018-11-16 23:40:51.859  INFO 44132 --- [           main] com.shuyu.prototype.Resume               : name=测试1
2018-11-16 23:40:51.859  INFO 44132 --- [           main] com.shuyu.prototype.Resume               : company=阿里

 

代码github地址:https://github.com/iot-wangshuyu/designpatterns/tree/master/prototype

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值