事例:克隆羊问题
现有一只羊叫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原型的处理