什么是原型模式
提供一种创建对象的方式,在程序中创建对象时发送一个已经创建好的对象,在内存中直接copy一份与它一样的对象返回来。可以用来应对结构比较复杂且使用比较多的对象的创建方式。
/**
* 代码块编译是报错的,只是拿Object演示 使用clone方法 类必须实现Cloneable接口标记才可以使用克隆方法
还有一种方法是实现序列化的接口 将实例中的信息写入内存中
*/
Object obj1 = new Object();
Object obj2 = obj1.clone();
注意事项
需要克隆的类必须实现Cloneable接口,Cloneable这个接口中没有方法,只是用来标记的。不标记会抛出java.lang.CloneNotSupportedException
优点
在系统中需要创建大量相同对象时,可以使用原型模式。比如数据统计中的三个月内半年内每天的统计量对象。也可以用来创建结构比较复杂的对象。 原型模式会跳过初始化方法,直接在内存中写值。简化开发,提高效率。
代码实践
clone 的方式
public class CloneDemo implements Cloneable {
private String name;
private String price;
private CloneTest cloneTest;
@Override
public CloneDemo clone(){
CloneDemo cloneDemo = null;
try{
cloneDemo = (CloneDemo)super.clone();
}catch (Exception e){
e.printStackTrace();
}
return cloneDemo;
}
public CloneDemo(String name, String price) {
this.name = name;
this.price = price;
}
public CloneTest getCloneTest() {
return cloneTest;
}
public void setCloneTest(CloneTest cloneTest) {
this.cloneTest = cloneTest;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPrice() {
return price;
}
public void setPrice(String price) {
this.price = price;
}
}
序列化的方式
对象本身和对象中的引用类型对象都要实现序列化接口
/**
* 内部的引用类型对象都要实现序列化接口
* @return
*/
public CloneDemo cloneDemo(){
ByteArrayOutputStream bos = null;
ByteArrayInputStream bis = null;
ObjectOutputStream oos = null;
ObjectInputStream ois = null;
CloneDemo cloneDemo = null;
try{
//创建序列化流
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
//将当前对象以对象方式输出
oos.writeObject(this);
//创建反序列化流
bis = new ByteArrayInputStream(bos.toByteArray());
ois = new ObjectInputStream(bis);
cloneDemo = (CloneDemo)ois.readObject();
}catch (Exception e){
e.printStackTrace();
}finally {
try{
bos.close();
bis.close();
oos.close();
ois.close();
}catch (Exception e){
e.printStackTrace();
}
}
return cloneDemo;
}
以上,希望本文可以帮到你。