Java 设计模式 02:原型模式
原型模式
原型模式是以一个已经存在的实例为原型,通过复制这个实例的方法创建新实例的模式,实际上复制出来的对象并不一定和原对象相同。原型模式通常指创建相同种类的对象,因为 Java 自带的原型模式是通过二进制流的方式复制的,所以复制速度和复制效率都要高于使用new
的方法创建
原型模式的设计
Java 由于已经提供了clone
方法,在实现原型模式上十分简单,使用原型模式设计的程序必须具备以下几点:
- 抽象原型类:规定了具体原型类中必须要实现的接口
- 具体原型类:实现抽象类的
clone
方法,是可以被复制的对象
另外在这里需要提到浅克隆和深克隆:
- 浅克隆:创建一个新对象,新对象的属性和原对象完全相同,对于非基本类型属性,仍指向原有属性所指向的地址
- 深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原来的地址
Java 中通过Cloneable
接口的clone
方法实现的克隆为浅克隆
// 原型模式
public class ProtoTypeTest {
public static void main(String[] args) throws CloneNotSupportedException {
RealizeType object1 = new RealizeType();
RealizeType object2 = (RealizeType) object1.clone();
}
}
class RealizeType implements Cloneable {
RealizeType() {
System.out.println("具体原型创建成功");
}
public Object clone() throws CloneNotSupportedException {
System.out.println("具体原型复制成功");
return (RealizeType) super.clone();
}
}
原型模式的优缺点
优点
- Java 自带的原型模式性能更优
- 可以使用深克隆的方式保存对象状态,可辅助实现撤销操作
缺点
- 需要为每一个类都配置一个
clone
方法 clone
方法位于类的内部,违背了开闭原则- 深克隆时逻辑较为复杂