GoF的23种设计模式
设计模式之——原型模式(Prototype)
原型(Prototype)模式定义
用一个已经创建成功的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。
原型模式的分类(克隆)
- 浅克隆:只复制基本类型的数据,引用类型的数据只复制了引用的地址,引用的对象并没有复制,在新的对象中修改引用类型的数据会影响原对象中的引用。
简单说就是不会克隆对象引用的对象,而只是简单地复制这个引用。 - 深克隆:克隆后的对象与原对象之间内容完全一样,但是互不影响。
浅克隆的实现
Java 中的 Object 类提供了浅克隆的 clone() 方法,实现 Cloneable 接口就可实现对象的浅克隆。
举例:
public class Demo implements Cloneable{
private String name;
public Demo(String name){
this.name=name;
}
@Override
protect Object clone() throws CloneNotSupportedException{
return (Demo)super.clone();
}
}
//测试类
public class Test{
public static void main(String[] args) throws Exception{
Demo demo1=new Demo();
Demo demo2=(Demo)demo1.clone();
System.out.println("result="+(demo1==demo2));//返回false
}
}
深克隆的实现
1.重写clone方法,使用父类中的clone方法实现深克隆;
2.重写clone方法,并使用序列化方法实现深克隆(效率相对较低)
使用父类clone方法的实现
public class Demo1 implements Cloneable{
public Demo1(){}
@Override
public Object clone() throws CloneNotSupportedException{
Demo1 demo1 = null;
try {
demo1 = (Demo1) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return demo1;
}
}
public class Demo2 implements Cloneable{
private Demo1 demo1;
public Demo2(Demo1 demo1){
this.demo1=demo1;
}
@Override
public Object clone() throws CloneNotSupportedException{
Demo2 demo2 = null;
try {
demo2 = (Demo2) super.clone();
demo2.setDemo1((Demo1)demo1.clone())
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return demo2;
}
}
使用深克隆的时候要注意,克隆对象包含所有非基本类型的对象类都要实现
重写父类clone方法的实现
public class Demo implements Cloneable{
public Demo(){}
@Override
public Object clone() throws CloneNotSupportedException{
Demo demo = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
try {
ObjectInputStream ois = new ObjectInputStream(bais);
demo = (Demo) ois.readObject();
ois.close();
} catch (Exception) {
e.printStackTrace();
}
return demo;
}
}