设计模式-原型模式

名称:原型设计模式
作用:创建内部属性相同的对象

种类:
    1:浅拷贝:内部的值类型和字符串类型都可以复制成功
        方式:实现Cloneable接口,实现clone方法
    2:深拷贝:除了内部的值类型和字符串类型,引用类型也能复制成功
        方式:
            1、实现Cloneable接口,实现clone方法
            2、序列化

浅拷贝(实现Cloneable接口,实现clone方法)

package com.prototype;
/**
 * dz����
 * @author zonkin
 *
 */
public class User1 implements Cloneable{
	private String name;
	private Integer age;
	private String sex;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public User1(String name, Integer age, String sex) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
	}
	
	
	
	@Override
	public String toString() {
		return "User1 [name=" + name + ", age=" + age + ", sex=" + sex + "]";
	}
	@Override
	public Object clone() throws CloneNotSupportedException {
		User1 user = null;
		user = (User1)super.clone();
		return user;
	}
}

深拷贝(实现Cloneable接口,实现clone方法)

package com.prototype;
/**
 * ���
 * ʵ��clone����
 * @author zonkin
 *
 */
public class User2 implements Cloneable{
	private String name;
	private Integer age;
	private String sex;
	private Dog dog;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	
	public Dog getDog() {
		return dog;
	}
	public void setDog(Dog dog) {
		this.dog = dog;
	}
	public User2(String name, Integer age, String sex, Dog dog) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
		this.dog = dog;
	}
	
	
	@Override
	public String toString() {
		return "User2 [name=" + name + ", age=" + age + ", sex=" + sex + ", dog=" + dog.toString() + " " + dog.hashCode() + "]";
	}
	@Override
	public Object clone() throws CloneNotSupportedException {
		User2 user = null;
		user = (User2)super.clone();
		
		Dog d = user.getDog();
		user.setDog((Dog)d.clone());
		return user;
	}
}
package com.prototype;

import java.io.Serializable;

public class Dog implements Serializable, Cloneable{
	private String name;
	private Integer age;
	
	
	public String getName() {
		return name;
	}


	public void setName(String name) {
		this.name = name;
	}


	public Integer getAge() {
		return age;
	}


	public void setAge(Integer age) {
		this.age = age;
	}


	public Dog(String name, Integer age) {
		super();
		this.name = name;
		this.age = age;
	}


	@Override
	public String toString() {
		return "Dog [name=" + name + ", age=" + age + "]";
	}


	@Override
	protected Object clone() throws CloneNotSupportedException {
		Dog dog = null;
		dog = (Dog)super.clone();
		return dog;
	}
}

深拷贝(序列化)(推荐使用)

package com.prototype;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * ���
 * ϵ�л�
 * @author zonkin
 *
 */
public class User3 implements Serializable, Cloneable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String name;
	private Integer age;
	private String sex;
	private Dog dog;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	
	public Dog getDog() {
		return dog;
	}
	public void setDog(Dog dog) {
		this.dog = dog;
	}
	public User3(String name, Integer age, String sex, Dog dog) {
		super();
		this.name = name;
		this.age = age;
		this.sex = sex;
		this.dog = dog;
	}
	
	
	@Override
	public String toString() {
		return "User3 [name=" + name + ", age=" + age + ", sex=" + sex + ", dog=" + dog.toString() + " " + dog.hashCode() + "]";
	}
	@Override
	public Object clone(){
		User3 user = null;
		ByteArrayOutputStream baos = null;
		ObjectOutputStream oos = null;
		ByteArrayInputStream bais = null;
		ObjectInputStream ois = null;
		try {
			 baos = new ByteArrayOutputStream();
			 oos = new ObjectOutputStream(baos);
			 oos.writeObject(this);
			
			 bais = new ByteArrayInputStream(baos.toByteArray());
			 ois = new ObjectInputStream(bais);
			 user = (User3)ois.readObject();
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(baos != null) {
					baos.close();
				}
				if(oos != null) {
					oos.close();
				}
				if(bais != null) {
					bais.close();
				}
				if(ois != null) {
					ois.close();
				}
			} catch (Exception e2) {
				e2.printStackTrace();
			}	
		}
		return user;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值