创建型-原型模式
2020-04-25 本文已影响0人
程序男保姆
- 定义
用原型实例对象指定创建对象种类,并通过拷贝这些原型对象创建新的对象(根据原型对象,克隆一个新的对象)
- 优点
场景一:当我们编写组件需要创建新的实例对象, 但是又不想依赖于初始化操作(不依赖于构器,构造方法),便可以采用原型模式。
场景二:如果我们初始化过程中需要耗费非常大资源(数据资源,硬件资源),便可以采用原型模式。(数据资源:构造方法需要许多初始化参数)
- 缺点
类图
/***
* 原型模式 又称克隆模式
*/
public class Student implements Cloneable {
private String name;
private Date date;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
/***
* 浅克隆模式
* 仅仅克隆基础数据类型 对引用类型则克隆对象的地址
* @return
* @throws CloneNotSupportedException
*/
// @Override
// protected Object clone() throws CloneNotSupportedException {
// return super.clone();
// }
/***
* 深克隆模式
* 不仅克隆基础数据类型 还对引用类型的值 而非对象的地址
* 引用对象也需要克隆
* @return
* @throws CloneNotSupportedException
*/
@Override
protected Object clone() throws CloneNotSupportedException {
Student clone = (Student) super.clone();
Date clone1 = (Date) this.getDate().clone();
clone.setDate(clone1);
return clone;
}
@Override
public String toString() {
return ""+name+"/"+date.toString();
}
}
public class Test {
public static void main(String[] args) throws CloneNotSupportedException {
Student student = new Student();
Date date = new Date(0);
student.setName("init");
student.setDate(date);
for (int i = 0; i < 10; i++) {
Student studentclone = (Student) student.clone();
studentclone.getDate().setTime(10000);
studentclone.setName("1111");
System.out.println(studentclone);
}
System.out.println(student.toString());
}
}