9.原型模式

来源:互联网 发布:人民币大写转换编程 编辑:程序博客网 时间:2024/06/14 18:26
package prototypePattern;import java.util.ArrayList;import java.util.List;/** * 原型模式 * * @author LiMing E-mail:1151143484@qq.com * @date 2017年6月14日 上午8:59:49 * * * *       用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 我理解的原型模型就是☆克隆对象☆ *       ☆原型模式的注意事项 *       ☆使用原型模式复制对象不会调用类的构造方法 *      ☆因为对象的复制是通过调用Object类的clone方法来完成的,它直接在内存中复制数据,因此不会调用到类的构造方法 *       ☆不但构造方法中的代码不会执行 *       ☆甚至连访问权限都对原型模式无效。 *       ------ 还记得单例模式吗?单例模式中,只要将构造方法的访问权限设置为private型,就可以实现单例 ☆ *       ------ 但是clone方法直接无视构造方法的权限,所以,单例模式与原型模式是冲突的,在使用时要特别注意。 ☆ *      ☆ 深拷贝与浅拷贝。 *      ☆Object类的clone方法只会拷贝对象中的基本的数据类型 *        ☆对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。 * ------ PS:深拷贝与浅拷贝问题中,会发生深拷贝的有java中的8中基本类型以及他们的封装类型,另外还有String类型。其余的都是浅拷贝。 * */public class PrototypePattern {public static void main(String[] args) {ConcretePrototype cp = new ConcretePrototype();for (int i = 0; i < 10; i++) {ConcretePrototype clonecp = (ConcretePrototype) cp.clone();clonecp.show();//这个输出你可以先把             prototype.list = (List) ((ArrayList) this.list).clone(); //注释掉 然后再运行    取消注释再运行 运行结果不一样 是因为不深拷贝list会公用一个地址 如果深拷贝后会自己用自己的listSystem.out.println(clonecp.list.add(i)+":"+clonecp.list);}}}//可clone父类class Prototype implements Cloneable {public  List<Object> list = new ArrayList<Object>();@SuppressWarnings({ "unchecked", "rawtypes" })public Prototype clone() {Prototype prototype = null;try {prototype = (Prototype) super.clone();//list不会被深拷贝 想要深拷贝需要自己写相关代码 手动clone             prototype.list = (List) ((ArrayList) this.list).clone();  } catch (CloneNotSupportedException e) {e.printStackTrace();}return prototype;}}//可clone子类class ConcretePrototype extends Prototype {public void show() {System.out.println("原型模式实现类");}}

原创粉丝点击