原型模式(Prototype):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
new一个对象耗时严重或者需要new很多对象时可以考虑原型模式。
应注意浅克隆和深克隆的问题。
原型模式Demo:
/**
* 2018年3月27日下午8:11:18
*/
package com.Designpattern;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
/**
* @author xinwenfeng
*
*/
public class TestPrototype {
/**
* @param args
* @throws CloneNotSupportedException
*/
public static void main(String[] args) throws CloneNotSupportedException {
PrototypePeople p = new PrototypePeople("雪绒花",22);
MyPrototype mp = new MyPrototype("无名",p);
mp.show();
MyPrototype mp2 = (MyPrototype) mp.clone();
mp2.show();
MyPrototype mp3 = mp.deepClone();
mp3.show();
System.out.println("============================================");
MyPrototypeDeep mpd = new MyPrototypeDeep(new PrototypePerson("WZ111"));
mpd.show();
MyPrototypeDeep mpd1 = mpd.deepclone();
mpd1.show();
}
}
class PrototypePeople implements Cloneable{
private String name;
private int age;
public PrototypePeople(String name,int age) {
this.name = name;
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
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;
}
}
class MyPrototype implements Cloneable{
private String s;
private PrototypePeople people;
public MyPrototype(String s,PrototypePeople people) {
this.s = s;
this.people = people;
}
public void show() {
System.out.println(this.toString()+" s="+s+"\npeople= "+people+" p.name:"+people.getName()+" p.age:"+people.getAge());
}
//浅克隆(实现Cloneable接口),值类型的会复制,引用类型的只会复制引用不会复制引用对象,两个引用指向同一个对象
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
//深克隆
protected MyPrototype deepClone() throws CloneNotSupportedException {
MyPrototype m = (MyPrototype) super.clone();
m.people = (PrototypePeople) people.clone();
return m;
}
}
class PrototypePerson implements Serializable{
private String name;
public PrototypePerson(String name) {
this.setName(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class MyPrototypeDeep implements Serializable{
private PrototypePerson person;
public MyPrototypeDeep(PrototypePerson person) {
this.person = person;
}
public void show() {
System.out.println(this+"\nperson= "+person+" p.name:"+person.getName());
}
//深克隆,序列化实现
public MyPrototypeDeep deepclone(){
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(this);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
return (MyPrototypeDeep) ois.readObject();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
结果: