1. 原型模式简介
原型模式(Prototype Pattern)是创建型设计模式,根据一个原型对象,通过Clone的方式,创建出一个新的对象。
Java的原型模式特别简单,一个类只需要实现Cloneable接口,并且重写(Override)Object类中clone方法。
2. 原型模式举例
原型类 Person
/**
* 在java虚拟机中,只有实现Cloneable接口的类才可以被拷贝,
* 否则在运行时会抛出CloneNotSupportedException异常。
*/
public class Person implements Cloneable{
private int age;
public Person(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// 浅拷贝
@Override
public Person clone(){
Person person = null;
try {
person = (Person)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return person;
}
}
客户端类
public class PrototypeMain {
public static void main(String[] args) {
Person person = new Person("张三", 18);
// 克隆过后,可以修改克隆的对象,变成你想要的对象
Person copy = person.clone();
// person 和 copy 这2个对象的内存地址不相等。
System.out.println(person == copy);
}
}
3. 关于Clone
Java的世界里,创建对象的方式包括:使用new操作符、反序列化、通过反射的newInstance方法和Clone方式。
关于Clone,需要注意的是,Clone方式创建实例对象,不会调用类的构造器,不论构造器的访问权限是public还是private,因此,如果单例模式类没有通过手段防备,其对象也可能被clone出来。
Clone要注意深拷贝和浅拷贝的问题。Object类的clone方法只会拷贝对象中8种基本数据类型和它们的封装类,对于其它类型(对于数组、容器对象、引用对象)的对象,只会拷贝其引用,是为浅拷贝。例如Person类里有一个Phone类的属性,现在有个Person对象A,拷贝出对象B,B中的Phone和A中的Phone是同一个,修改了其中一个,就会影响另一个。如果要实现深拷贝,就需要在clone方法里自己实现深拷贝。
@Override
public Person clone(){
Person person = null;
try {
person = (Person)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
// 深拷贝
person.phone = (Phone)phone.clone();
return person;
}
4. 原型模式总结
Clone的方式创建对象,比通过new创建对象的效率要高;因此原型模式适合创建对象成本较高的场景。
原型模式需要为类编写clone方法,尤其是在深拷贝的场景,需要层层实现深拷贝。
(完)
网友评论