什么是原型模式
原型模式是一种创建型设计模式,是指创建新对象的时候,根据现有的一个原型来创建。
简单来说就是就是对象的克隆(Object.clone())。
原型模式分为浅拷贝和深拷贝:
(浅复制)只是拷贝了基本类型的数据,而引用类型数据,只是拷贝了一份引用地址。
(深复制)在计算机中开辟了一块新的内存地址用于存放复制的对象。
创建者模式使用场景
- 如果你需要复制一些对象, 同时会修改对象属性, 可以使用原型模式。
- new对象非常复杂,消耗资源多,可以使用原型模式。
创建者的优缺点
创建者的优点
- 可以方便地生成复杂对象。
- 以克隆预生成原型, 避免反复运行初始化代码。
- 可以克隆对象, 而无需与它们所属的具体类相耦合。
创建者的缺点
克隆包含循环引用的复杂对象可能会非常麻烦。
创建者的实现
- 必须实现Cloneable接口。
告诉JVM类可以进行拷贝,只有标记的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。 - 必须重写clone方法。
作用是返回对象的一个拷贝,必须声明为public。
/**
* 深拷贝
*/
public class Prototype {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "张某某";
p1.age = 18;
p1.contact = new ArrayList<>();
p1.contact.add("手机号");
p1.contact.add("邮箱");
Person p2 = p1.clone();
System.out.println("p1 == p2:" + (p1 == p2));
System.out.println("p1.contact == p2.contact:" + (p1.contact == p2.contact));
p2.contact.add("QQ");
System.out.println("p1.contact:" + p1.contact.toString());
System.out.println("p2.contact:" + p2.contact.toString());
}
}
class Person implements Cloneable {
public String name;
public Integer age;
public ArrayList<String> contact;
@Override
public Person clone() {
try {
Person p = (Person) super.clone();
//此处进行深度拷贝,如果不加就是复制了地址,可以注释掉此行查看输出内容
p.contact = (ArrayList<String>) this.contact.clone();
return p;
} catch (CloneNotSupportedException e) {
throw new AssertionError();
}
}
}
总结
如果你有一个对象, 并希望生成与其完全相同的一个复制品,那么你可以用原型模式。