原型模式
package prototype;
public class PrototypeTest {
public static void main(String[] args) throws CloneNotSupportedException {
BaseInfo baseInfo = new BaseInfo("xxx");
Product product = new Product("part1","part2",3,4,baseInfo);
Product clone= (Product) product.clone();
System.out.println("original:"+product);
System.out.println("clone:"+clone);
product.getBaseInfo().setCompayName("yyy");
System.out.println("original:"+product);
System.out.println("clone:"+clone);
}
}
class BaseInfo implements Cloneable{
private String compayName;
public BaseInfo(String compayName) {
this.compayName = compayName;
}
public String getCompayName() {
return compayName;
}
public void setCompayName(String compayName) {
this.compayName = compayName;
}
@Override
protected BaseInfo clone() throws CloneNotSupportedException {
return ((BaseInfo)super.clone());
}
@Override
public String toString() {
return super.hashCode()+" "+"BaseInfo{" +
"compayName='" + compayName + '\'' +
'}';
}
}
class Product implements Cloneable{
private String part1;
private String part2;
private Integer part3;
private Integer part4;
private BaseInfo baseInfo;
public Product() {
}
public Product(String part1, String part2, Integer part3, Integer part4,BaseInfo baseInfo) {
this.part1 = part1;
this.part2 = part2;
this.part3 = part3;
this.part4 = part4;
this.baseInfo = baseInfo;
}
public String getPart1() {
return part1;
}
public void setPart1(String part1) {
this.part1 = part1;
}
public String getPart2() {
return part2;
}
public void setPart2(String part2) {
this.part2 = part2;
}
public Integer getPart3() {
return part3;
}
public void setPart3(Integer part3) {
this.part3 = part3;
}
public Integer getPart4() {
return part4;
}
public void setPart4(Integer part4) {
this.part4 = part4;
}
public BaseInfo getBaseInfo() {
return baseInfo;
}
public void setBaseInfo(BaseInfo baseInfo) {
this.baseInfo = baseInfo;
}
@Override
public String toString() {
return super.hashCode()+" Product{" +
"part1='" + part1 + '\'' +
", part2='" + part2 + '\'' +
", part3=" + part3 +
", part4=" + part4 +
", baseInfo=" + baseInfo +
'}';
}
@Override
protected Product clone() throws CloneNotSupportedException {
Product clone = (Product) super.clone();
BaseInfo baseInfoClone=this.baseInfo.clone();
clone.setBaseInfo(baseInfoClone);
return clone;
}
}
第二种实现方法(不推荐,消耗内存)
package prototype;
import java.io.*;
public class PrototypeTest {
public static void main(String[] args) throws CloneNotSupportedException {
BaseInfo baseInfo = new BaseInfo("xxx");
Product product = new Product("part1","part2",3,4,baseInfo);
Product clone= (Product) product.clone();
System.out.println("original:"+product);
System.out.println("clone:"+clone);
product.getBaseInfo().setCompayName("yyy");
System.out.println("original:"+product);
System.out.println("clone:"+clone);
}
}
class BaseInfo implements Cloneable,Serializable{
private String compayName;
public BaseInfo(String compayName) {
this.compayName = compayName;
}
public String getCompayName() {
return compayName;
}
public void setCompayName(String compayName) {
this.compayName = compayName;
}
@Override
protected BaseInfo clone() throws CloneNotSupportedException {
return ((BaseInfo)super.clone());
}
@Override
public String toString() {
return super.hashCode()+" "+"BaseInfo{" +
"compayName='" + compayName + '\'' +
'}';
}
}
class Product implements Cloneable ,Serializable{
private String part1;
private String part2;
private Integer part3;
private Integer part4;
private BaseInfo baseInfo;
public Product() {
}
public Product(String part1, String part2, Integer part3, Integer part4,BaseInfo baseInfo) {
this.part1 = part1;
this.part2 = part2;
this.part3 = part3;
this.part4 = part4;
this.baseInfo = baseInfo;
}
public String getPart1() {
return part1;
}
public void setPart1(String part1) {
this.part1 = part1;
}
public String getPart2() {
return part2;
}
public void setPart2(String part2) {
this.part2 = part2;
}
public Integer getPart3() {
return part3;
}
public void setPart3(Integer part3) {
this.part3 = part3;
}
public Integer getPart4() {
return part4;
}
public void setPart4(Integer part4) {
this.part4 = part4;
}
public BaseInfo getBaseInfo() {
return baseInfo;
}
public void setBaseInfo(BaseInfo baseInfo) {
this.baseInfo = baseInfo;
}
@Override
public String toString() {
return super.hashCode()+" Product{" +
"part1='" + part1 + '\'' +
", part2='" + part2 + '\'' +
", part3=" + part3 +
", part4=" + part4 +
", baseInfo=" + baseInfo +
'}';
}
@Override
protected Product clone() throws CloneNotSupportedException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
ObjectOutputStream oos = new ObjectOutputStream(byteArrayOutputStream);
oos.writeObject(this);
} catch (IOException e) {
e.printStackTrace();
}
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
try {
ObjectInputStream ois =new ObjectInputStream(byteArrayInputStream);
Object object=ois.readObject();
return (Product) object;
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}