原型模式比较简单,您可以花上一个小时来学习它。
原型模式定义:
原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的.
原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据.
原型模式中的拷贝分为"浅拷贝"和"深拷贝":
浅拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象.(说明,即是对八大数据类型进行拷贝)
深拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制.(说明,即是可以对引用对象进行拷贝)
下面我们举例说明,先说说浅拷贝:现在有一个absuser类,包含姓名和电话号码,首先user类需要实现java的Cloneable接口。可以将user类定义为一个抽象类:
public abstract class absuser implements Cloneable{
private String username;
private String phone;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public Object clone(){
try {
return super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
然后创建克隆自身的操作 user类,这个类继承absuser抽象类
public class user extends absuser{ public user(String username,String phone) { setUsername(username); setPhone(phone); } }然后就是客户端:
absuser u = new user("韩梅梅","15888888888","2015",15); absuser u1 = (absuser) u.clone(); System.out.println(u1.getUsername()); if(u == u1){ System.out.println("对象相等?"); }else{ System.out.println("对象不相等?"); }这里打印出的结果肯定是对象不相等的。说明我们克隆成功了。
深拷贝又是什么呢?假设我们这里的absuser类有一个引用变量 userinfo(用户的信息:班级和学生证信息),如果我们直接就这样使用是可以获取到userinfo里面的值的,但是当你试着打印这两个userinfo时,你会发现她们居然是同一个对象。为了实现我们的克隆目的,我们需要这样做:
1,userinfo同样需要实现Cloneable接口,并实现clone方法,代码如下:
public class userinfo implements Cloneable { private String grand; private int paper; public String getGrand() { return grand; } public void setGrand(String grand) { this.grand = grand; } public int getPaper() { return paper; } public void setPaper(int paper) { this.paper = paper; } public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } } }2,其次,在absuserinfo里面添加这个引用变量,并重写的clone方法,代码如下
public abstract class absuser implements Cloneable{ private String username; private String phone; private userinfo uif; public userinfo getUif() { return uif; } public void setUif(userinfo uif) { this.uif = uif; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public Object clone(){ absuser auser = null; try { auser = (absuser) super.clone(); auser.uif = (userinfo) this.uif.clone(); return auser; } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }3,测试类:
public class demo { /** * @param args */ public static void main(String[] args) { absuser u = new user("韩梅梅","15888888888","2015",15); absuser u1 = (absuser) u.clone(); System.out.println(u1.getUsername()); System.out.println(u1.getUif().getGrand()); if(u == u1){ System.out.println("对象相等?"); }else{ System.out.println("对象不相等?"); } if(u.getUif() == u1.getUif()){ System.out.println("uif对象相等?"); }else{ System.out.println("uif对象不相等?"); } } }这样我们就完成了深克隆,上面测试代码的结果是,对象不相等,uif对象不相等
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情