定义
原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,不需要知道任何创建的细节,不调用构造函数
适用场景
- 类初始化消耗较多资源
- new产生的一个对象需要非常繁琐的过程(数据准备、访问权限等)
- 构造函数比较复杂
- 循环体中生产大量对象
优点
- 原型模式性能比直接new一个对象性能高
- 简化创建过程
缺点
- 必须配备克隆方法
- 对克隆复杂对象或对克隆出的对象进行复杂构造时,容易引入风险
- 深拷贝、浅拷贝要运用得当
浅拷贝
//原型模式实现Cloneable接口
public class Pig implements Cloneable {
public String name;
public Date birthday;
public Pig(String name, Date birthday) {
this.name = name;
this.birthday = birthday;
}
@Override
protected Pig clone() throws CloneNotSupportedException {
return (Pig) super.clone();
}
}
public class Test {
public static void main(String[] args) throws Exception {
//实例化一个小猪1
Pig pig1 = new Pig("佩奇",new Date(0L));
System.out.println(pig1.birthday);
//拷贝生成一个小猪2
Pig pig2 = pig1.clone();
//更改小猪1的生日
pig1.birthday.setTime(999999999999L);
//小猪2的生日也随之更改了
System.out.println(pig2.birthday);
}
}
原型模式默认浅克隆,虽然pig1和pig2是两个不同的对象,但是内部成员变量Date(引用类型)则是指向的同一个对象。所以更改了pig1的生日,pig2的生日也随之变化了。
深克隆
public class Pig implements Cloneable {
public String name;
public Date birthday;
public Pig(String name, Date birthday) {
this.name = name;
this.birthday = birthday;
}
@Override
protected Pig clone() throws CloneNotSupportedException {
Pig pig = (Pig) super.clone();
//深克隆
pig.birthday = (Date) pig.birthday.clone();
return pig;
}
}