设计模式之原型模式

原型模式设计是利用已有对象,然后通过拷贝已有对象而创建新对象,创建的新对象和原有对象一样,也称为克隆。

其实现也非常简单,只需要实现JAVA Cloneable接口即可。但是默认情况下只会复制基本数据类型(浅克隆),而复合属性不会被拷贝,

因此要实现深克隆,则需要将所有的复合属性对象也要实现Cloneable接口。

下面列出代码:

package com.dean.dp.prototype;

import java.io.Serializable;
import java.util.ArrayList;

/**
 * 学生对象,里面包括教师复合属性
 * 
 * 原型模式,需要克隆的对象实现Cloneable接口
 * 深克隆:对复合属性也进行复制
 * 浅克隆:默认只将基本属性复制
 * 如果需要实现深克隆,则复合属性也需要实现Cloneable接口
 * @author bobei01
 *
 */
public class Student implements Cloneable,Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = -9152047277342310459L;
	
	//学生名字
	private String name;
	
	//学生的所有老师
	private ArrayList<Teacher> teachers;

	public String getName() {
		return name;
	}

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

	public ArrayList<Teacher> getTeachers() {
		return teachers;
	}

	public void setTeachers(ArrayList<Teacher> teachers) {
		this.teachers = teachers;
	}

	@SuppressWarnings("unchecked")
	@Override
	protected Student clone() throws CloneNotSupportedException {
		Student student = (Student) super.clone();
		//深度克隆 复合属性的复制
		this.teachers = ((ArrayList<Teacher>) this.teachers.clone());
		return student;
	}

}


package com.dean.dp.prototype;

import java.io.Serializable;

/**
 * 教师对象,里面包括学生复合属性
 * @author bobei01
 *
 */
public class Teacher implements Cloneable,Serializable{

	/**
	 * 
	 */
	private static final long serialVersionUID = -9205846416774290730L;
	
	//教师名字
	private String name;
	
	//教师下所教的某一学生
	private Student student;

	public String getName() {
		return name;
	}

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

	public Student getStudent() {
		return student;
	}

	public void setStudent(Student student) {
		this.student = student;
	}

	@Override
	protected Teacher clone() throws CloneNotSupportedException {
		Teacher teacher = (Teacher) super.clone();
		this.student = this.student.clone();
		return teacher;
	}
	

}

测试用例:

package com.dean.dp.prototype;

import java.util.ArrayList;

public class Main {

	public static void main(String[] args) {
		Student student = new Student();
		student.setName("张三");
		ArrayList<Teacher> teachers = new ArrayList<Teacher>();
		Teacher t1 = new Teacher();
		t1.setName("t1");
		Teacher t2 = new Teacher();
		t2.setName("t2");
		teachers.add(t1);teachers.add(t2);
		student.setTeachers(teachers);
		//克隆学生
		try {
			Student stu2 = student.clone();
			System.out.println(stu2.getName());
			for (Teacher teacher : stu2.getTeachers()) {
				System.out.println(teacher.getName());//t1/t2
			}
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值