(Java)设计模式学习笔记--原型模式

原型模式:用原型实例指定创建对象的种类,并通过复制这些原型创建新的对象。
 
使用场景:
1:类的初始化需要消耗非常多的资源,这个资源包括数据,硬件资源等,通过原型复制避免这些消耗。
2:通过new产生一个对象需要非常繁琐的数据准备或访问权限。
3:一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式复制多个对象供调用者使用,既保护性拷贝。
 
(只有当以上情况时,拷贝才会体现其性能上的优势)
 
使用:
让要拷贝的类实现Cloneable接口,并实现clone()方法。
在作为原型的对象处调用其clone方法产生克隆对象。
 
(通过拷贝创建对象时,不会执行构造函数)
 
 
拷贝分为浅拷贝和深拷贝:
浅拷贝副文档中的变量指向原型变量的地址,既改变拷贝对象的变量时,原型变量的值也会发生改变,深拷贝既重新生成一个全新的变量,虽然值一样,但地址不同,这时改变拷贝的值不再影响原型对象的值。(引用数据类型才有影响,基本数据类型不受两种拷贝模式的影响,基本数据类型的数据不会受拷贝对象改变而影响原型的变量的数值)
 
浅拷贝:
package com.example.mywechat.bean;
 
import java.util.ArrayList;
 
/**
* 类描述:
* 创建人:maimanchuang
* 创建时间:2017/12/18 14:33
*/
public class Person extends BaseBean implements Cloneable {
private String number;
private String passwork;
private ArrayList<String> nu= new ArrayList<String>();
 
public ArrayList<String> getNu() {
return nu;
}
 
public void setNu(ArrayList<String> nu) {
this. nu = nu;
}
 
public Person(String number, String passwork) {
this. number = number;
this. passwork = passwork;
}
 
public String getNumber() {
return number;
}
 
public void setNumber(String number) {
this. number = number;
}
 
public String getPasswork() {
return passwork;
}
 
public void setPasswork(String passwork) {
this. passwork = passwork;
}
 
@Override
protected Object clone() throws CloneNotSupportedException {
Person person= (Person) super.clone();
person. number= this. number;
person. passwork= this. passwork;
person. nu= this. nu;
return person;
}
}
 
Person person=new Person("123","456");
Person personClone=person.clone();
 
---------------
 
深拷贝:
@Override
protected Object clone() throws CloneNotSupportedException {
Person person= (Person) super.clone();
person. number= this. number;
person. passwork= this. passwork;
person. nu= (ArrayList<String>) this. nu.clone();
return person;
}
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值