23种设计模式之原型模式
原型模式的定义
定义: 用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象.
通俗的讲,就是不再使用new 来创建对象, 而改用 clone 方法来得到新的对象
原型模式的核心是一个 clone 方法, 通过该方法进行对象的拷贝, Java提供了一个Cloneable接口来标识这个对象是可拷贝的,为什么说是"标识" 呢? 翻开JDK的帮助看Cloneable是一个方法都没有的, 这个接口只是一个标记作用,在JVM中具有这个标记的对象才有可能被拷贝. 如何从"有可能被拷贝" 转换成"可以被拷贝"呢?方法是覆盖 clone 方法.
原型模式的通用代码:
原型模式的应用
原型模式的优点
- 性能优良. 原型模式是在内存二进制流的拷贝, 要比直接new 一个对象性能好很多, 特别是要在一个循环体内产生大量的对象时, 原型模式可以更好的体现其优点
- 逃避构造函数的约束. 这既是它的优点也是缺点, 直接在内存中拷贝, 构造函数是不会执行的. 优点是减少了约束, 缺点也是减少了约束, 需要在实际应用时考虑
原型模式的使用场景
- 资源优化场景. 类初始化需要消化非常多的资源, 这个资源包括数据、硬件资源等
- 性能和安全要求的场景. 通过new产生一个对象需要非常繁琐的数据准备或访问权限, 则可以使用原型模式
- 一个对象多个修改者的场景. 一个对象需要提供给其它对象访问, 而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用.
在实际项目中,原型模式很少单独出现, 一般是和工厂方法模式一起出现, 通过clone的方法创建一个对象, 然后由工厂方法提供给调用者.
原型模式的注意事项
- 构造函数不会被执行. 因为Object类的clone方法是从内存中以二进制流的方式进行拷贝, 重新分配一个内存块, 那构造函数没有执行也就十分正常了
- 浅拷贝和深拷贝. Object类提供的方法clone只是拷贝本对象, 其对象内部的数组、引用对象等都不拷贝, 还是指向原生对象的内部元素地址, 这种拷贝就叫浅拷贝. 这时两个对象共享同一个变量, 你改我也改, 是一种非常不安全的方式. 那怎么实现深拷贝呢? 对类变量进行独立的拷贝即可. 这样两个对象你改你的,我改我的,互不影响.
- clone和final. 对象的clone与对象内的final是有冲突的. 对象的final变量不能拷贝
原型模式先生产出一个包含大量共有信息的类, 然后可以拷贝出副本, 修正信息, 建立了一个玩完整的个性对象