原型模式就是实现克隆的过程
原型模式的设计目的:
原型模式中利用过一个原型对象指出要创建对象的类型,通过复制这个对象的方法来获得与该对象一样的对象的实例
原型模式定义:
用原型实例指定创建对象的种类,并通过复制原型创建对象。
发动创建的对象通过请求原型对象来拷贝远行对象自己来实现创建过程,所发动创建的对象只需要知道原型对象的类型就可以获得更多的原型实例对象。至于对象如何创建不必关心。
原型模式中有两种复制(浅拷贝,深拷贝或叫做浅复制,深复制)
浅拷贝:使用一个已知实例对新创建实例的成员变量逐个赋值
深拷贝:一个类的拷贝构造方法,不仅要复制对象的所有非引用成员变量值,还要为引用类型的成员变量创建新的实例,初始化为形式参数实例值。
浅拷贝只复制一个对象,传递应用,不能复制实例。深拷贝对对象内部的引用均复制,创建一个新的实例,并且复制实例。
浅拷贝中当对象的成员变量是基本数据类型时,两个对象的成员变量已有存储空间,赋值运算传递值,所以浅拷贝能够复制实例,当对象的成员变量是引用数据类型就不能实现对象复制
原型模式主要有三个角色:
Prototype:抽象原型类,声明克隆自身的接口;
ConcretePrototype:具体原型类,实现克隆的具体操作;
Client:客户类,让一个原型克隆自身,从容获得一个新对象
public class PrototypeDemo implements Cloneable{
public Object clone(){
Object object = null;
try {
object = super.clone();
} catch (CloneNotSupportedException exception) {
System.err.println("Not support cloneable");
}
return object;
}
}
Object类提供了一个clone方法,可以将Java对象复制一份,直接使用Java中的clone方法直接复制,如若实现clone的类必须要实现Cloneable接口才能够具备复制的能力直接调用会抛出CloneNotSupportedException异常
clone方法:
1.对任何的对象x,都有x.clone()!=x,克隆对象与原对象不是同一个对象
2.对任何的对象x,都有x.clone().getClass()==x.getClass(),克隆对象与原对象的类型一样
3.如果对象x的equals方法定义恰当,那么x.clone().equals(x)成立
模式的优缺点:
优点:
- 创建新的对象时比较复杂,可以利用原型模式简化对象创建过程,同时也能够提高效率
- 可以使用深克隆保持对象的状态
- 原型模式提供了简化的创建结构
缺点:
- 实现申客隆的时候可能需要比较复杂的代码
- 需要为每一个类配备一个克隆方法,需要对功能进行考虑,对已有的类进行改造需要修改远吗,违背了开闭原则