用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。
package com.strife.pattern.prototype;
import java.io.*;
/**
* 原型模式
*
* @author mengzhenghao
* @date 2022/5/29
*/
public class Prototype {
public static void main(String[] args) throws IOException, ClassNotFoundException {
final Sheep sheep = new Sheep("sheep", 1, "白色");
System.out.println(sheep);
final Sheep dolly = sheep.clone();
System.out.println(dolly);
final Sheep dolly1 = sheep.deepClone();
System.out.println(dolly1);
final Sheep dolly2 = sheep.deepClone2();
System.out.println(dolly2);
}
}
class Cat implements Cloneable, Serializable {
private String name;
public Cat(String name) {
this.name = name;
}
@Override
public Cat clone() {
try {
Cat clone = (Cat) super.clone();
// TODO: copy mutable state here, so the clone can't change the internals of the original
return clone;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
class Sheep implements Cloneable, Serializable {
private String name;
private int age;
private String color;
public Cat friend;
public Sheep(String name, int age, String color) {
this.name = name;
this.age = age;
this.color = color;
this.friend = new Cat("friend");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public String toString() {
return "Sheep{" +
"name='" + name + '\'' +
", age=" + age +
", color='" + color + '\'' +
", friend=" + friend.hashCode() +
'}';
}
/**
* 浅拷贝,默认为浅拷贝
* Sheep{name='sheep', age=1, color='白色', friend=325040804}
* Sheep{name='sheep', age=1, color='白色', friend=325040804}
*/
@Override
public Sheep clone() {
try {
Sheep clone = (Sheep) super.clone();
return clone;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
/**
* 深拷贝,引用对象单独拷贝
* Sheep{name='sheep', age=1, color='白色', friend=325040804}
* Sheep{name='sheep', age=1, color='白色', friend=1173230247}
*/
//@Override
//public Sheep clone() {
// try {
// Sheep clone = (Sheep) super.clone();
// clone.friend = this.friend.clone();
// return clone;
// } catch (CloneNotSupportedException e) {
// throw new AssertionError();
// }
//}
/**
* 深拷贝
* Sheep{name='sheep', age=1, color='白色', friend=325040804}
* Sheep{name='sheep', age=1, color='白色', friend=1915910607}
*/
public Sheep deepClone() {
ByteArrayOutputStream bos = null;
ObjectOutputStream oos = null;
ByteArrayInputStream bis = null;
ObjectInputStream ois = null;
try {
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
//将对象写到流里面:序列化
oos.writeObject(this);
bis = new ByteArrayInputStream(bos.toByteArray());
ois = new ObjectInputStream(bis);
//从流里面读出对象:反序列化
return (Sheep) ois.readObject();
} catch (IOException | ClassNotFoundException e) {
throw new RuntimeException(e.getMessage());
} finally {
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* try with resources
* Sheep{name='sheep', age=1, color='白色', friend=325040804}
* Sheep{name='sheep', age=1, color='白色', friend=284720968}
*/
public Sheep deepClone2() {
try (
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
) {
oos.writeObject(this);
//从流里面读出对象:反序列化
try (
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bis);
) {
//将对象写到流里面:序列化
return (Sheep) ois.readObject();
}
} catch (IOException | ClassNotFoundException e) {
throw new RuntimeException(e.getMessage());
}
}
}