JAVA 23种设计模式之创建型—原型模式(5)

原型模式比较简单,您可以花上一个小时来学习它。

型模式定义:

原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的.
原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据.

原型模式中的拷贝分为"浅拷贝"和"深拷贝":
浅拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象.(说明,即是对八大数据类型进行拷贝)
深拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制.(说明,即是可以对引用对象进行拷贝)


下面我们举例说明,先说说浅拷贝:现在有一个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/天,具体规则查看活动详情Blog Img