原型模式
来源:互联网 发布:rpg游戏源码 编辑:程序博客网 时间:2024/06/07 00:15
原型模式
- 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
- 优点:原型模式是在内存二进制流的拷贝,要比直接new一个对象性能好很多,特别是要在一个循环体内产生大量的对象时,原型模式可以更好地体现其优点;逃避构造函数的约束,直接在内存中拷贝,构造函数不会执行。
- 浅拷贝:Java做了一个偷懒的拷贝动作,Object类提供的方法clone只是拷贝本对象,原始类型比如int、long、char、String(stringpool机制)等都会被拷贝,其对象内部的数组、引用对象(类的成员变量、一个可变的引用对象)等都不拷贝,还是指向原生对象的内部元素地址,这种拷贝就叫做浅拷贝。
- 深拷贝:对象内部的数组、引用对象要独立拷贝。
- 注意:要使用clone方法,类的成员变量上不要增加final关键字。
通用模式
1.拷贝对象
public class Thing implements Cloneable { private String name; // 定义一个私有变量 private ArrayList<String> arrayList = new ArrayList<String>(); @Override public Thing clone() { Thing thing = null; try { thing = (Thing) super.clone(); //增加 arrayList 的拷贝为深拷贝 thing.arrayList = (ArrayList<String>)this.arrayList.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return thing; } // 设置添加ArrayList的值 public void setValue(String value) { this.arrayList.add(value); } // 取得arrayList的值 public ArrayList<String> getValue() { return this.arrayList; } public String getName() { return name; } public void setName(String name) { this.name = name; }}
2.测试类
public class Client { public static void main(String[] args) { // 产生一个对象 Thing thing = new Thing(); // 设置一个值 thing.setValue("张三"); thing.setName("张三"); // 拷贝一个对象 Thing cloneThing = thing.clone(); cloneThing.setValue("李四"); cloneThing.setName("李四"); System.out.println(thing.getValue()); System.out.println(cloneThing.getValue()); System.out.println(thing.getName()); System.out.println(cloneThing.getName()); }}
3.运行结果
[张三][张三, 李四]张三李四
注:《设计模式之禅》笔记
阅读全文