原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。
原型模式,就是将一个原型对象传递给要发动创建行为的对象,要发动创建行为的对象调用原型对象的拷贝方法来实现对象的创建。它属于创建型模式,特殊的是原型类本身就是工厂,克隆方法就是工厂方法。在Java中,Object类提供了clone方法,来实现对象的克隆。自定义类可以重新实现该方法。需要注意的是,如果一个类需要被克隆,那么它需要实现Cloneable接口(一个空接口,只做标记),否则调用clone方法将抛出异常。一般情况下,clone对象和源对象满足下列条件:
- clone对象和源对象是不同对象,即A!=A1。他们在内存中,占用不同的地址。
- 具有相同的类型,即A.class == A1.class
- 如果equals方法定义正确,A.equals(A1)
- 浅clone和深clone都回得到一个新对象
- 对于值类型的成员两种clone的效果相同
- 对于引用类型的成员,浅clone得到的是同一个地址的引用,深clone得到的是一个新对象地址的引用
在实际使用中,当有多个原型对象时,可以设计一个原型管理器,来管理原型对象。它相当于一个容器,存放一些类的“样本”,当外部需要一个样本相同的新对象时,通过请求原型管理器,原型管理器来调用相应对象的clone来完成新对象的创建。
优点:
- 当创建操作比较复杂时,可以简化过程,提高效率。
- 省去了工厂类,不需要复杂的分等级的工厂,简化设计。
- 可以保存状态,实现一些功能,例如撤销。
- 需要在类内部实现clone方法,修改时违反开闭原则
- 深克隆需要复杂的编码,嵌套对象时,每一层都要实现,比较复杂。
- 创建对象成本较大时,可以通过clone得到类似对象,然后稍作修改。
- 如果需要保存对象状态,可以配合备忘录模式实现
- 需要避免负责的分层次的工厂类时,并且对象只有一个或较少的几个状态时,通过clone比通过构造更方便。