定义:
实验原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
原理:
将一个原型对象传给发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝自己来实现创建过程。
角色和职能
- Prototype(抽象原型类):声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至还可以是具体的实现类。
- ConcretePrototype(具体原型类):实现抽象原型类中声明的克隆方法,在克隆方法中返回自己一个克隆对象。
- Client(客户类):让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。
Java实现
- Java的Object类中存在克隆方法clone(),但是只能克隆实现了Cloneable接口的类。
- 使用这样的实现,对Java而言是深拷贝,会重新创建一个新的对象。
深拷贝与浅拷贝
- 浅拷贝:如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。通过实现Cloneable接口的类都属于浅拷贝。
- 深拷贝:如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象复制一份给克隆对象。简而言之,深拷贝除了复制值类型还复制引用类型。可以通过实现Serializable接口,通过序列化还复制新的类。