设计模式之禅学习——原型模式
1、原型模式非常简单,要使用原型模式时只要将被clone的类继承Cloneable接口,并重写clone()方法就可以。
2、原型模式的原理是内存二进制流的拷贝,要比直接New出一个对象快得多,性能能够得到很大提升。当我们 要产生大量一个类的对象时,这些对象只是细节上不同,这时就可以通过原型模式提高代码的效率。原型模 式一般不会单独使用,一般和工厂模式在一起,同clone的方法创建一个对象,然后由工厂方法。,提供给 调用者。
3、一个原型模式的例子:
package com.wang.prototypePattern; /** * 原型模式 * @author HeJW * */ public class PrototypeClass implements Cloneable { public PrototypeClass(){ System.out.println("创建"); } @Override protected PrototypeClass clone() { PrototypeClass prototypeClass = null; try { prototypeClass = (PrototypeClass)super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return prototypeClass; } }
在使用时:
package com.wang.prototypePattern; public class App { public static void main(String[] args) { PrototypeClass prototypeClass1 = new PrototypeClass(); PrototypeClass prototypeClass2 = prototypeClass1.clone(); } }
4、在拷贝对象时,会有深拷贝和浅拷贝的区别,首先看浅拷贝的代码:
package com.wang.prototypePattern.develop; import java.util.ArrayList; /** * 浅拷贝 * * @author HeJW * */ public class QianClone implements Cloneable { private ArrayList<String> arrayList = new ArrayList<String>(); @Override protected QianClone clone() { QianClone qian = null; try { qian = (QianClone) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return qian; } public void setValue( String value ){ this.arrayList.add(value); } public ArrayList<String> getValue(){ return this.arrayList; } public static void main(String[] args) { QianClone qian = new QianClone(); qian.setValue("张三"); QianClone qianClone = qian.clone(); qianClone.setValue("李四"); System.out.println(qian.getValue()); } }
执行后的结果是:
[张三, 李四]
为什么会有李四呢,没有对arrayList进行clone啊。是因为java在clone时,只是clone本对象,其对象内部数组、引用对象都不clone,还是指向原生对象,这就是浅拷贝,多个对象共享一个私有变量,不安全。
再来看深拷贝,只是比浅拷贝多一句代码,让不同的对象使用其自己clone的私有变量,不共同使用一个:
package com.wang.prototypePattern.develop; import java.util.ArrayList; /** * 深拷贝 * * @author HeJW * */ public class ShenClone implements Cloneable { private ArrayList<String> arrayList = new ArrayList<String>(); @Override protected ShenClone clone() { ShenClone shen = null; try { shen = (ShenClone) super.clone(); //比浅拷贝多了一句话。。。 shen.arrayList = (ArrayList<String>)this.arrayList.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return shen; } public void setValue( String value ){ this.arrayList.add(value); } public ArrayList<String> getValue(){ return this.arrayList; } public static void main(String[] args) { ShenClone shen = new ShenClone(); shen.setValue("张三"); ShenClone shenClone = shen.clone(); shenClone.setValue("李四"); System.out.println(shen.getValue()); } }
这样运行后只有:
[张三]
相关推荐
原型模式实践代码
java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】 * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 ...
即原型模式,提供一个已经存在的对象进行新对象创建的接口,一般情况下都是使用Clone接口。 此模式非常简单,简单的说就是复制多个当前对象供使用。Prototype模式允许一个对象再创建另外一个可定制的对象,根本...
clone顾名思义是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建...
47丨原型模式:如何最快速地clone一个HashMap散列表?1
原型模式的实现完整代码示例(code):原型模式的实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用 C++实现,并在 VC 6.0 下测试运行)。 代码片断 1:Prototype.h //Prototype.h...
原型模式:就是从一个对象再创建另一个可定制的对象,而且不需要知道任何创建的细节。 重写抽象类中的Clone方法或者重写ICloneable中的Clone方法。 也就是说:要实现克隆的这个类,必须实现其Clone方法。
13.3.2 原型模式的使用场景 13.4 原型模式的注意事项 13.4.1 构造函数不会被执行 13.4.2 浅拷贝和深拷贝 13.4.3 clone与final两个冤家 13.5 最佳实践 第14章 中介者模式 14.1 进销存管理是这个样子的吗? 14.2 中介...
本文实例讲述了PHP设计模式之原型模式定义与用法。分享给大家供大家参考,具体如下: 原型设计模式(Prototype Design Pattern)很有意思, 因为它使用了一种克隆技术来复制实例化的对象. 新对象是通过复制原型实例来...
php /** * 原型模式 * * 用原型实例指定创建对象的种类.并且通过拷贝这个原型来创建新的对象 * */ abstract class Prototype { private $_id = null; public function __construct($id) { $this->_id = $id; } ...
PHP有一个内置的克隆方法__clone()可以在设计模式中使用,但是不能直接访问,使用clone关键字即可。克隆不会启动构造函数。 二、什么时候使用原型设计模式 如果一个项目要求你创建某个原型对象的多个实例,就可以...
通过New产生一个对象需要非常繁琐的数据准备或者访问权限,则可以使用原型模式 二、优点: 1、效率高,避免了重新执行构造过程步骤 2、ProtoType类似New,但不同于New,克隆出的对象属性值与原型对象相同,克隆出的...
原型模式(Prototype)是通过复制一个已经存在的实例来返回新的实例,而不是新建实例,被复制的实例是我们所称的原型对象,这个原型是可定制的。 2、原理 有两部分组成,抽象原型和具体原型。意图:用原型...
leetcode 分类 DesignPatternAndAlgorithm 常用设计模式和算法,练习用。...原型模式:与new一个新对象不同,原型模式是clone出一个新对象。已与java融为一体,实现Cloneable接口。分为深拷贝和浅拷贝。 抽
原型模式说明 说明:使用原型实例来 拷贝 创建新的可定制的对象;新建的对象,不需要知道原对象创建的具体过程; 过程:Prototype => new ProtoExam => clone to new Object; 使用相关代码: 代码如下: function ...
git clone 最新版 不多说上资源 好用测试ok git clong git clone 最新版 不多说上资源 好用测试ok git clong
在使用高版本版KEIL时,提示要升级固件,升级后就出现JLINK is Clone的提示!“the emulator is JLink-Clone, the segger software only support orginal segger device” 然后闪退,IDE崩溃关闭! 解决方案: 1....
原型模式中主要角色 抽象原型(Prototype)角色:声明一个克隆自己的接口 具体原型(Concrete Prototype)角色:实现一个克隆自己的操作 当一个类大部分都是相同的只有部分是不同的时候,如果需要大量这个类的对象,...
Clone 属性的相关内容 Clone 属性的相关内容
支持多个git库clone,提交等常用操作,用户需要根据实际情况微调参数