定义:指原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象
特点:不需要知道任何创建的细节,不用调用构造函数
类型:创建型
适用场景
- 类初始化消耗过多资源
- new产生的一个对象需要非常繁琐的过程(数据准备,访问权限等)
- 构造函数比较复杂
- 循环体中产生大量对象时
优点
- 原型模式性能比直接new一个对象性能高
- 简化创建过程
缺点
- 必须配备克隆方法
- 对克隆复杂对象或对克隆出的对象进行复杂改造时,容易引入风险
- 深拷贝和浅拷贝要运用得当
package main.java.creational.prototype;
import java.util.Date;
public class Girl implements Cloneable {
private String name;
private Date birthday;
public Girl() {
}
public Girl(String name, Date birthday) {
this.name = name;
this.birthday = birthday;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Girl{" +
"name='" + name + '\'' +
", birthday=" + birthday +
'}';
}
@Override
protected Object clone() throws CloneNotSupportedException {
// 深克隆
Girl girl = (Girl) super.clone();
girl.birthday = (Date) girl.birthday.clone();
return girl;
}
}
package main.java.creational.prototype;
import java.util.Date;
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Girl girl = new Girl("阿狸真身", new Date());
for (int i = 1; i < 10; i++) {
Girl girlTemp = (Girl) girl.clone();
girlTemp.setName("阿狸影分身" + i);
girlTemp.getBirthday().setTime(i * 100000000L);
System.out.println(girlTemp);
}
System.out.println("活捉真身:" + girl);
}
}