1: 简介

原型模式使用原型实例指定创建对象的种类,并且通过拷贝原型对象创建新的对象。UML类图如下

设计模式之【原型模式】_成员变量

主要是复制对象,核心类就是上面类图中的Prototype。这个类需要具备以下两个条件:

 1:实现Cloneable接口。作用就是在运行的时候,通知虚拟机可以安全地实现了此接口类上使用clone方法

 2:  重写Object类中的clone方法。进行对象复制

2: 代码如下


//原型类
public class Prototype implements Cloneable{

@Override
public Prototype clone() {
Prototype prototype = null;
try {
prototype = (Prototype)super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return prototype;
}
}

//原型类实现类
public class CreatePrototype extends Prototype{

public void init() {
System.out.println("原型模式实现类,初始化");
}
}

//测试类
public class TestMain {
public static void main(String[] args) {
CreatePrototype createPrototype = new CreatePrototype();
for (int i = 0; i < 5; i++) {
CreatePrototype clone = (CreatePrototype)createPrototype.clone();
clone.init();
}
}
}

3: 优缺点

使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,直接操作内存中的二进制流,特别是复制大对象的试试,性能的差异是非常明显的。并且使用原型模式,简化对象的创建。如果在开发过程中,需要重复的创建相似对象时候可以考虑使用原型模式。

4: 注意事项

1: 使用原型模式复制对象不会调用类的构造方法。

对象的复制是通过Object类的clone方法来完成的,直接在内存中复制数据,因此不会调用类的构造方法。

2:深拷贝和浅拷贝

浅拷贝:

当类的成员变量是基础类型时,浅拷贝会复制该属性的值赋值给新对象

当成员变量是引用数据类型时,浅拷贝复制的是引用数据类型的地址值,当拷贝出的一个类修改了引用数据类型的成员变量,会导致所有拷贝出来的类发生改变。


深拷贝:

不仅复制成员变量为基础数据类型的值给新对象,还会给是应用类型的成员变量申请存储空间,并复制引用数据类型成员变量的对象。完全复制一个全新的对象。