原型模式指的是, 用户可以在某个对象中克隆出与对象属性一致的实例. 这个过程叫克隆 , 被复制的实例就是"原型".
原型模式多用于创建过程复杂或者构造耗时的实例 , 在该情况下直接使用原型模式 , 不仅能是代码更清晰 , 也能使程序运行更高效.
使用场景
- 初始化消耗资源很多
- 新产生对象流程复杂
- 一个对象需要供给其他对象访问,而且各个对象都需要修改其值时,可以拷贝多个对象供调用者访问,即保护性拷贝
实现
使用User类来做个实例, 类对象有两个基本类型 , 一个引用类型
public class User implements Cloneable{
//基本类型
private String name;
private String age;
//引用类型
private ArrayList<Integer> scores;
@Override
protected User clone() throws CloneNotSupportedException {
User user= (User) super.clone();
user.age=this.age;
user.name=this.name;
// user.scores= (ArrayList<Integer>) this.scores.clone();
user.scores=this.scores;
return user;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public ArrayList<Integer> getScores() {
return scores;
}
public void setScores(ArrayList<Integer> scores) {
this.scores = scores;
}
}
过程
- 让类对象实现Cloneable接口 , 这个接口并没有任何方法 , 只是一个标记;同时 重写clone方法 , 这个方法是Object中的方法. 如果没有实现接口就重写clone方法 , 会抛出异常
- 该实例中有代码注释的地方 , 这里涉及到深拷贝和浅拷贝的东西了. 浅拷贝指的是 , 两个变量指向了同一块内存 , 一个改变 , 另一个也会跟着改变 ; 而深拷贝就相当于重新生成了一个新的变量 , 这个变量除了值和原型相同 , 其余并没有任何关系.
如果是类对象有引用变量, 在使用原型模式时 , 在clone函数中 , 必须对该对象调用xxx.clone方法 , 才能完成深拷贝 , 否则只能完成浅拷贝.
调用