原型模式:

原型模式是一种创建型模式,它一般用在需要快速创建大量相似的对象的情景下。
它与用new 创建对象的区别如下:
原型模式是一种内存二进制拷贝,所以比使用new 产生对象的方式来得快速高效。所以在需要重复地创建相似对象时可以考虑使用原型模式。比如需要在一个循环内创建对象,并且对象创建过程比较复杂或者循环次数很多的情况,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。
原型模式它创建对象的时候并不调用所创建对象的构造方法。这个是优点同时也是原型模式的缺点。
在使用原型模式的时候还需要注意的是浅拷贝和深拷贝
一般对于成员变量是基本数据类型,以及String类型的时候只需要使用浅拷贝即可,而对于那些成员变量包含数组,对象的类型,要注意使用深拷贝,否则那些成员变量是非基本变量的成员,在复制出来的对象中只是一个引用,这些引用指向的还是原对象,这样就会导致修改拷贝出的对象时,会对原对象产生干扰。
在原型模式中需要实现Cloneable接口。Cloneable它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。

public class PersonInfo implements Cloneable{
private String name;
private int age;
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;
}
protected Object clone() {
PersonInfo info = null;
try {
info = (PersonInfo) super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return info;
}
}
public class CustomInfo implements Cloneable{

private long id = 0;
private PersonInfo mPersonInfo = null;
public CustomInfo() {
System.out.println("调用构造方法");
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public PersonInfo getmPersonInfo() {
return mPersonInfo;
}
public void setmPersonInfo(PersonInfo mPersonInfo) {
this.mPersonInfo = mPersonInfo;
}
public Object clone() {
CustomInfo info = null;
try {
info = (CustomInfo) super.clone();
info.setmPersonInfo((PersonInfo) this.mPersonInfo.clone());
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return info;
}
public String toString() {
return "id = "+id +" name = "+ mPersonInfo.getName()+
" age = " +mPersonInfo.getAge()+" hashCode = "+ this.hashCode();
}
}
import java.util.Random;
public class Client {
public static void main(String args[]) {
CustomInfo info = new CustomInfo();
info.setId(new Random().nextLong());
PersonInfo pinfo = new PersonInfo();
pinfo.setAge(new Random().nextInt(100));
pinfo.setName("Jimmy");
info.setmPersonInfo(pinfo);
System.out.println(info.toString());
for(int i=0;i<10;i++) {
CustomInfo cinfo = (CustomInfo) info.clone();
cinfo.setId(2222222222222l);
System.out.println(cinfo.toString());
}
System.out.println(info.toString());
}
}
Contents
  1. 1. 原型模式: