原型模式
用原型实例指定创建对象的种类,并且通过这些原型创建新的对象。
原型模式角色
客户角色:该角色提出创建对象的请求;
抽象原型(Prototype)角色:该角色是一个抽象角色,通常由一个Java接口或者抽象类实现,给出所有具体原型类所需的接口;
具体原型(Concrete Prototype)角色:该角色是被复制的对象,必须实现抽象原型的接口。
原型模式优点
性能优良:原型模式是在内存二进制流的复制(clone方法是一个本地方法),要比直接new一个对象性能好,特别是在一个循环体内产生大量的对象时,原型模式可以更好地体现其优点;
逃避构造函数的约束:既是优点也是缺点,直接在内存中复制,构造函数是不会执行的,因此减少了约束,在实际应用中权衡考虑。
使用场景
资源优化场景,类初始化需要消耗非常多的资源,这个资源包括数据、硬件资源等;
性能和安全要求场景,通过new产生一个对象需要非常繁琐的数据准备或访问权限,可以使用原型模式;
一个对象多个修改者的场景,一个对象需要提供给其他对象访问,而且各个调用者需要修改其值时,可以考虑使用原型模式复制多个对象供调用者使用。
package prototypemodel;
/**
* 创建猴子的原型,并且实现Cloneable接口,便于实现克隆
*
*/
public class Monkey implements Cloneable {
private String name;
private int height;
//体重
private int weight;
//克隆方法,执行浅克隆
protected Monkey clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
Monkey monkey = null;
monkey = (Monkey)super.clone();
return monkey;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public String toString(){
return "name: "+name +";height: "+height+";weight: "+weight;
}
}
package prototypemodel;
public class TestPrototype {
public static void main(String[] args) {
// TODO Auto-generated method stub
Monkey monkey = new Monkey();
monkey.setName("孙悟空");
monkey.setHeight(173);
monkey.setWeight(65);
//克隆100个猴子
for(int i=0;i<100;i++){
Monkey clone;
try {
clone = monkey.clone();
clone.setName(monkey.getName() + i);
System.out.print(clone+"\n");
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}