目录
what什么是原型模式
GOF定义: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
Head_First定义:当创建给定类的事例的过程很昂贵或很复杂时,就使用原型模式。
定义:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。
why为什么需要原型模式
这个模式因为比较简单,很多文章都几乎没有介绍,Head_First和设计模式之禅里面也是简单介绍,甚至我们在工作中都可能没感觉,因为在很多人脑海中,原型用的场景少之又少,同时因为java自带的clone方法在实际工作中也不常用,加上在很多教材或者长辈会告诉我们,少用clone,clone很危险,在Effective java第三版这本书中也提到,必要时进行保护性clone,深拷贝浅拷贝的使用不当的例子也很多。
那什么时候需要原型模式呢,总结一下。
- 当一个系统应该独立于它的产品创建、构成和表示时,要使用Prototype;
- 以及当要实例化的类是在运行时刻指定时,例如,通过动态装载;
- 为了避免创建一个与产品类层次平行的工厂类层次时;
- 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
- 对象之间相同或相似,即只是个别的几个属性不同的时候。
- 创建对象成本较大,例如初始化时间长,占用CPU太多,或者占用网络资源太多等,需要优化资源。
- 创建一个对象需要繁琐的数据准备或访问权限等,需要提高性能或者提高安全性。
- 系统中大量使用该类对象,且各个调用者都需要给它的属性重新赋值。
how怎么实现原形模式
原型模式包含以下主要角色。
- 抽象原型类:规定了具体原型对象必须实现的接口。
- 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。
- 访问类:使用具体原型类中的 clone() 方法来复制新的对象。
开源框架经典案例
Spring中原型模式的使用
在 Spring中,原型模式应用的非常广泛,例如 scope='prototype'等都是原型模式的具体应用。
protected <T> T doGetBean( final String name, final Class<T> requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException { final String beanName