原型模式
即对于对象,我们通过类似复制的形式进行克隆,对于创建对象代价较大时,使用new进行创建就会使效率低下,使用原型模式就会提高效率
需要注意的就是深克隆和浅克隆
实现形式
实现Cloneable
接口
重写clone
方法
代码实现
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Pig implements Cloneable{
private int weight;
private Date birthDate;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
public class Consumer {
public static void main(String[] args) throws CloneNotSupportedException {
Date date = new Date();
Pig pig = new Pig(99,date);
System.out.println(pig);
System.out.println(pig.hashCode());
Pig clone = (Pig) pig.clone();
System.out.println(clone);
System.out.println(clone.hashCode());
}
}
此时结果为
Pig(weight=99, birthDate=Tue Mar 09 19:47:47 CST 2021)
382774248
Pig(weight=99, birthDate=Tue Mar 09 19:47:47 CST 2021)
382774248
假设我们在最后加上
date.setDate(999);
System.out.println(pig);
System.out.println(clone);
可以发现,pig和clone对象的date都变了,类似于深拷贝和浅拷贝,有深克隆和浅克隆之分
上面的例子就是浅克隆,如果需要深克隆,有多种方式,我们可以采用重写clone方法的形式深克隆
举例上面的例子,Pig类改写成
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Pig implements Cloneable{
private int weight;
private Date birthDate;
@Override
protected Object clone() throws CloneNotSupportedException {
Pig pig = (Pig) super.clone();
//对birthDate也进行clone
pig.birthDate = (Date) this.birthDate.clone();
return pig;
}
}
就会变成深克隆
应用
在Spring中
配置的xml文件里,如下,scope的属性如果是prototype
就是原型模式,如果是singleton
就是单例模式
<bean id="user2" class="com.Cai.pojo.User" c:name="c22" c:age="22" scope="prototype"/>
<!-- singleton单例模式-->
<!-- prototype原型模式-->