原型模式
定义一个复制接口,实体类去实现接口,创建实体类,使用实体类的复制方法创建新对象,可以避免new对象.避免系统开销, 也可以将原对象的属性值都继承下来.
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
当创建新对象开销较大时,可以使用该模式,但是该模式绕过了构造函数的限制。
UML
例:
需求:
写一份简历,可以方便更新工作经历
代码实现:
简历类
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
public class Resume implements Cloneable,Serializable{
/**
*
*/
private static final long serialVersionUID = 5465341684135145L;
private String name;
private String age;
private String sex;
private Work work;
public Work getWork() {
return work;
}
public void setWork(Work work) {
this.work = work;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
/**
* 浅复制
*
*/
@Override
public Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
/**
* 深复制
* return
* @throws Exception
*/
public Object deepClone() throws Exception{
// 序列化
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(this);
// 反序列化
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
return ois.readObject();
}
@Override
public String toString() {
// TODO Auto-generated method stub
System.out.println("姓名:"+name+",年龄:"+age+",性别:"+sex);
work.toString();
return null;
}
}
工作经历类:
import java.io.Serializable;
public class Work implements Serializable{
/**
*
*/
private static final long serialVersionUID = 4875412545845L;
private String company;
private String timeArea;
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public String getTimeArea() {
return timeArea;
}
public void setTimeArea(String timeArea) {
this.timeArea = timeArea;
}
@Override
public String toString() {
// TODO Auto-generated method stub
System.out.println("工作经历:"+timeArea+"在"+company+"工作");
return super.toString();
}
}
客户端
public class Client {
public static void main(String[] args) throws Exception {
Resume resumeA=new Resume();
resumeA.setAge("25");
resumeA.setName("求职者");
resumeA.setSex("男");
Work workA=new Work();
workA.setCompany("腾讯");
workA.setTimeArea("2011-2015");
resumeA.setWork(workA);
Resume resumeB= (Resume) resumeA.deepClone();
Work workB=resumeB.getWork();
workB.setTimeArea("2015-2017");
workB.setCompany("阿里巴巴");
resumeB.setWork(workB);
resumeA.toString();
resumeB.toString();
}
}