我们学习设计模式的时候学了原型模式,原型模式在我们的实际开发中使用场景也是很多的,我在实际开发中主要有以下两大场景:
1、在我们希望接下来这个类的操作与之前这个类的操作之间相互不影响;
2、通常在异步操作的时候避免多线程问题,在调用方法的时候不希望被调用方法对对象的操作影响本层的剩余业务逻辑处理;
在需要这样的时候我可以直接new一个对象自己赋值不采用原型模式呢?
当然可以,只要你不嫌麻烦,前辈们为我们提供了原型模式肯定是因为原型模式对我们有大大的好处的,一般来说原型模式给我们带来了以下的好处:
1、程序运行效率:可以节省new创建对象的时间,
2、代码开发效率:可以一个clone()方法搞定,无需复杂的赋值操作
3、代码的稳定性:依次一个一个的进行代码赋值,会不会因为一个Cv操作失误导致一个细微难察觉的代码bug发布出来了呢?
那么首先我们来看看要通过clone实现原型模式的代码吧
//第一步:对象实现Cloneable接口
//第二步:重写clone方法;
public Object clone() throws CloneNotSupportedException{
Student student=(Student)super.clone();
student.setStudentFiles((StudentFiles)studentFiles.clone());
return student;
}
//当我们需要进行深克隆的时候可以通过序列化的方式实现;
但是在实际开发中就会发现当我们需要使用原型模式的时候还需要去对对象model进行clone这种方式真的不是很友好;
what? 不友好吗?
当然,首先,这不符合开闭原则,我们在使用前并不知道这个需要使用原型模式,当需要使用的时候还需要去改老代码,这不是不符合开闭原则吗?
其次,我只是需要一个克隆对象,还需要去实现一堆复杂的浅克隆,深克隆代码吗?是不是有点太耗费功夫了呢?是的,作为程序员的我就是这么懒;
那么我们不使用clone,怎么快速友好,非侵入的实现原型模式呢?
这个时候我们的猪脚就上场了,而且还是两个
org.springframework.beans.BeanUtils
org.apache.commons.beanutils.BeanUtils
按照惯例,我们分析就从源码进入:
org.springframework.beans.BeanUtils
//使用无参数构造函数实例化类的便利方法。
public static <T> T instantiate(Class<T> clazz) throws BeanInstantiationException {
Assert.notNull(cl