事例:克隆羊问题
现有一只羊叫tom,请创建和tom属性完全相同的十只羊
传统方式
定义 Sheep
public class Sheep {
String name;
Sheep(String name) {
this.name = name;
}
@Override
public String toString() {
return "Sheep{" +
"name='" + name + '\'' +
'}';
}
}
调用sheep,如果创建10只,需要new10次即可
public class SheepClient {
public static void main(String[] args) {
Sheep sheep = new Sheep("tom");
Sheep sheep1 = new Sheep("tom");
System.out.println(sheep1);
}
}
好处:简单易懂
缺点:创建对象时,总要初始化属性,而不是动态获取运行时动态的属性,如果创建对象复杂时,效率比较低
Java的所有类都默认继承java.lang.Object类
Cloneable 中

为什么必须要实现Cloneable
因为如果不实现Cloneable接口,当调用clone()时会抛出CloneNotSupportedException异常
public class Sheep implements Cloneable {
String name;
Sheep(String name) {
this.name = name;
}
@Override
public String toString() {
return "Sheep{" +
"name='" + name + '\'' +
'}';
}
@Override
protected Sheep clone() {
Sheep sheep = null;
try {
sheep = (Sheep) super.clone();
} catch (CloneNotSupportedException e) {
System.out.println(e.getMessage());
}
return sheep;
}
}
public class SheepClient {
public static void main(String[] args) {
Sheep sheep = new Sheep("tom");
Sheep sheep2 = sheep.clone();
System.out.println(sheep2);
}
}
框架中原型的使用:Spring
Spring可使用原型方式创建对象scope设置为prototype
bean.xml

测试类

BeanFactory的实现类
先获取bean工厂

其内部是个同步代码块,返回ConfigurableListableBeanFactory

ConfigurableListableBeanFactory继承

AbstractBeanFactory实现ConfigurableBeanFactory


doGetBean中对配置中scope原型的处理

本文通过克隆羊的比喻,深入浅出地介绍了Java中对象克隆的两种方式:传统方式与实现Cloneable接口的方式。对比了两者的优缺点,并详细解释了为何需要实现Cloneable接口。最后,介绍了在Spring框架中如何使用原型方式创建对象。
359

被折叠的 条评论
为什么被折叠?



