原型模式介绍
原型模式一般很少单独使用,一般和工厂方法模式一起组合使用.
类图
优点
- 性能好.使用native方法直接在堆内存中拷贝,性能比new好很多.
- 规避构造函数的约束.直接拷贝内存,不会执行构造函数.
使用场景
- 比如需要在循环体内产生大量对象.
- 规避构造函数的约束.
场景举例
- 信用卡账单邮件模板.
根据模板生成一个对象, 每封邮件都是次对象的clone.
注意
- 除基本类型外的其他类型(比如ArrayList,自定义对象等),都不会做拷贝.Clone对象和原对象的成员变量的引用相同.
- final修饰的成员变量无法实现深拷贝.
浅拷贝和深拷贝
- 只有java的基本类型才会拷贝,其他类型拷贝需要特殊处理,处理方式见下方代码.
基本拷贝
public class Test { public static void main(String[] args) { ConcretePrototype cp = new ConcretePrototype(); for (int i = 0; i < 5; i++) { ConcretePrototype clone = (ConcretePrototype) cp.clone(); clone.show(); } }}class Prototype implements Cloneable { @Override public Prototype clone() { try { return (Prototype) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; }}class ConcretePrototype extends Prototype { public void show() { System.out.println("原型模式实现!"); }}
深拷贝
class Thing implements Cloneable{ private ArrayListlist = new ArrayList<>(); @Override public Thing clone(){ try { Thing thing = (Thing)super.clone(); thing.list = (ArrayList )this.list.clone(); return thing; } catch (CloneNotSupportedException e) { e.printStackTrace(); } return null; }}