23种设计模式之原型模式

原型模式的定义

定义: 用原型实例指定创建对象的种类, 并且通过拷贝这些原型创建新的对象.

通俗的讲,就是不再使用new 来创建对象, 而改用 clone 方法来得到新的对象

原型模式的核心是一个 clone 方法, 通过该方法进行对象的拷贝, Java提供了一个Cloneable接口来标识这个对象是可拷贝的,为什么说是"标识" 呢? 翻开JDK的帮助看Cloneable是一个方法都没有的, 这个接口只是一个标记作用,在JVM中具有这个标记的对象才有可能被拷贝. 如何从"有可能被拷贝" 转换成"可以被拷贝"呢?方法是覆盖 clone 方法.

原型模式的通用代码:

23种设计模式之原型模式

 

原型模式的应用

原型模式的优点

  1. 性能优良. 原型模式是在内存二进制流的拷贝, 要比直接new 一个对象性能好很多, 特别是要在一个循环体内产生大量的对象时, 原型模式可以更好的体现其优点
  2. 逃避构造函数的约束. 这既是它的优点也是缺点, 直接在内存中拷贝, 构造函数是不会执行的. 优点是减少了约束, 缺点也是减少了约束, 需要在实际应用时考虑

原型模式的使用场景

  1. 资源优化场景. 类初始化需要消化非常多的资源, 这个资源包括数据、硬件资源等
  2. 性能和安全要求的场景. 通过new产生一个对象需要非常繁琐的数据准备或访问权限, 则可以使用原型模式
  3. 一个对象多个修改者的场景. 一个对象需要提供给其它对象访问, 而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用.

在实际项目中,原型模式很少单独出现, 一般是和工厂方法模式一起出现, 通过clone的方法创建一个对象, 然后由工厂方法提供给调用者.

原型模式的注意事项

  1. 构造函数不会被执行. 因为Object类的clone方法是从内存中以二进制流的方式进行拷贝, 重新分配一个内存块, 那构造函数没有执行也就十分正常了
  2. 浅拷贝和深拷贝. Object类提供的方法clone只是拷贝本对象, 其对象内部的数组、引用对象等都不拷贝, 还是指向原生对象的内部元素地址, 这种拷贝就叫浅拷贝. 这时两个对象共享同一个变量, 你改我也改, 是一种非常不安全的方式. 那怎么实现深拷贝呢? 对类变量进行独立的拷贝即可. 这样两个对象你改你的,我改我的,互不影响.
  3. clone和final. 对象的clone与对象内的final是有冲突的. 对象的final变量不能拷贝

原型模式先生产出一个包含大量共有信息的类, 然后可以拷贝出副本, 修正信息, 建立了一个玩完整的个性对象

23种设计模式之原型模式

全文结束