嗨,今天天气大幅度降温,大家注意保暖哦!
时间过的真快,今天将是创建型结构中的最后一个设计模式了---原型设计模式。
官方概述:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
小编简单的说就是我们就是把对象复制一份不去new啦。
那为什么呢,原因很简单,效率高。最近做项目就用到该模式,实体A关联实体B,B关联实体C。而通过实现序列化和反序列化的深度复制,只需复制A,那么关联的对象都可以同时复制成功,前提是实现Serializable接口,一种jdk规范。
工具类如下:
/**
* 深度复制
* @param source 源对象
* @return 目标对象
*/
public static Serializable deeplyCopy(Serializable source) {
if(source == null) {
return source;
}
Serializable target = null;
//1.声明四个流对象的变量
ObjectInputStream ois = null;
ObjectOutputStream oos = null;
ByteArrayInputStream bais = null;
ByteArrayOutputStream baos = null;
//2.try...catch...finally结构
try{
//3.创建字节数组的输出流
baos = new ByteArrayOutputStream();
//4.创建对象输出流
oos = new ObjectOutputStream(baos);
//5.执行序列化操作:将对象序列化后得到的数据写入baos,更本质的来说,是通过baos写入到了字节数组中
oos.writeObject(source);
//6.通过baos获取字节数组
byte[] buffer = baos.toByteArray();
//7.根据字节数组创建字节数组的输入流
bais = new ByteArrayInputStream(buffer);
//8.根据字节数组输入流创建对象输入流
ois = new ObjectInputStream(bais);
//9.执行反序列化操作:将对象数据从字节数组中读取出来,然后恢复为对象
target = (Serializable) ois.readObject();
}catch(Exception e){
e.printStackTrace();
}finally{
//10.释放资源
if(oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(ois != null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//11.返回目标对象
return target;
}
第二种是克隆的形式,需要实现Cloneable接口
而克隆又分深复制和浅复制。
package org.huey.partten.prototype;
import java.util.Date;
/**
* 浅复制
* @author huey
*
*/
public class Robot1 implements Cloneable{
private String name;
private Date birthday;
@Override
protected Object clone() throws CloneNotSupportedException {
Object object = super.clone();
return object;
}
public Robot1() {
}
public Robot1(String name, Date birthday) {
super();
this.name = name;
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Robot [name=" + name + ", birthday=" + birthday + "]";
}
}
package org.huey.partten.prototype;
import java.util.Date;
/**
*
* @author huey
*
*/
public class Client {
public static void main(String[] args) throws CloneNotSupportedException {
Date date = new Date(12121121);
Robot1 robot1 = new Robot1("机器人原型", date);
System.out.println("未修改时间原型"+robot1);
Robot1 clone = (Robot1) robot1.clone();
date.setTime(2121);
robot1.setBirthday(date);
// 比较时间是否一致,如果一致,都指向一个date对象
System.out.println("修改时间原型"+robot1);
System.out.println("克隆"+clone);
}
}
package org.huey.partten.prototype;
import java.util.Date;
/**
* 浅复制
* @author huey
*
*/
public class Robot2 implements Cloneable{
private String name;
private Date birthday;
@Override
protected Object clone() throws CloneNotSupportedException {
Object object = super.clone();
Robot2 robot2 = (Robot2) object;
robot2.birthday = (Date) this.birthday.clone();
return robot2;
}
public Robot2() {
}
public Robot2(String name, Date birthday) {
super();
this.name = name;
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Robot [name=" + name + ", birthday=" + birthday + "]";
}
}
package org.huey.partten.prototype;
import java.util.Date;
/**
* 深复制
*
* @author huey
*
*/
public class Client2 {
public static void main(String[] args) throws CloneNotSupportedException {
Date date = new Date(12121121);
Robot2 robot2 = new Robot2("机器人原型2", date);
System.out.println("未修改时间原型"+robot2);
Robot2 clone = (Robot2) robot2.clone();
date.setTime(21212);
robot2.setBirthday(date);
// 比较时间是否一致,如果不一致,各自拥有一个date对象
System.out.println(robot2.getBirthday() == clone.getBirthday());
// 内容比较
System.out.println("修改时间后原型"+robot2);
System.out.println("克隆"+clone);
}
}
还是那句话,天气凉了,注意保暖哦。
创建型一个5种设计模式,下次将分享结构型的了哦。如果你没看过,往前面自己找一下吧,看准图图,看准huey。
下次见哦!