原型模式

萝らか妹 提交于 2020-03-08 06:58:07
原型模式(Prototype  Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。
 
    原型模式,就是将一个原型对象传递给要发动创建行为的对象,要发动创建行为的对象调用原型对象的拷贝方法来实现对象的创建。它属于创建型模式,特殊的是原型类本身就是工厂,克隆方法就是工厂方法。在Java中,Object类提供了clone方法,来实现对象的克隆。自定义类可以重新实现该方法。需要注意的是,如果一个类需要被克隆,那么它需要实现Cloneable接口(一个空接口,只做标记),否则调用clone方法将抛出异常。一般情况下,clone对象和源对象满足下列条件:
  • clone对象和源对象是不同对象,即A!=A1。他们在内存中,占用不同的地址。
  • 具有相同的类型,即A.class == A1.class
  • 如果equals方法定义正确,A.equals(A1)
    这里存在一个问题,如果A的类型成员中,包含引用类型,那么clone得到的A1中的相应成员将会和源对象A中的成员指向同一个对象。问题引出了浅clone和深clone。
  • 浅clone和深clone都回得到一个新对象
  • 对于值类型的成员两种clone的效果相同
  • 对于引用类型的成员,浅clone得到的是同一个地址的引用,深clone得到的是一个新对象地址的引用
    深clone可以通过序列化实现。对一个对象序列化,原有对象不变,序列化的结果相对于对原对象的一个描述。反序列化时,将得到一个“全新”的对象。
    在实际使用中,当有多个原型对象时,可以设计一个原型管理器,来管理原型对象。它相当于一个容器,存放一些类的“样本”,当外部需要一个样本相同的新对象时,通过请求原型管理器,原型管理器来调用相应对象的clone来完成新对象的创建。
    优点:
  • 当创建操作比较复杂时,可以简化过程,提高效率。
  • 省去了工厂类,不需要复杂的分等级的工厂,简化设计。
  • 可以保存状态,实现一些功能,例如撤销。
    缺点:
  • 需要在类内部实现clone方法,修改时违反开闭原则
  • 深克隆需要复杂的编码,嵌套对象时,每一层都要实现,比较复杂。
    适用场景:
  • 创建对象成本较大时,可以通过clone得到类似对象,然后稍作修改。
  •  如果需要保存对象状态,可以配合备忘录模式实现
  • 需要避免负责的分层次的工厂类时,并且对象只有一个或较少的几个状态时,通过clone比通过构造更方便。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!