`

原型模式——clone

阅读更多

设计模式之禅学习——原型模式

 

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());
	}

}

    这样运行后只有:

[张三]

 

 

源码:我的Git——https://github.com/hejiawang/DesignPattern

1
2
分享到:
评论

相关推荐

    原型模式实践代码

    原型模式实践代码

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】 * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 ...

    设计模式 创建型模式 Prototype模式(原型)

    即原型模式,提供一个已经存在的对象进行新对象创建的接口,一般情况下都是使用Clone接口。 此模式非常简单,简单的说就是复制多个当前对象供使用。Prototype模式允许一个对象再创建另外一个可定制的对象,根本...

    详解Java中的clone方法?原型模式

     clone顾名思义是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建...

    47丨原型模式:如何最快速地clone一个HashMap散列表?1

    47丨原型模式:如何最快速地clone一个HashMap散列表?1

    实例讲解C++编程中对设计模式中的原型模式的使用

    原型模式的实现完整代码示例(code):原型模式的实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用 C++实现,并在 VC 6.0 下测试运行)。 代码片断 1:Prototype.h //Prototype.h...

    设计模式(十)之原型模式.zip

    原型模式:就是从一个对象再创建另一个可定制的对象,而且不需要知道任何创建的细节。 重写抽象类中的Clone方法或者重写ICloneable中的Clone方法。 也就是说:要实现克隆的这个类,必须实现其Clone方法。

    java设计模式

    13.3.2 原型模式的使用场景 13.4 原型模式的注意事项 13.4.1 构造函数不会被执行 13.4.2 浅拷贝和深拷贝 13.4.3 clone与final两个冤家 13.5 最佳实践 第14章 中介者模式 14.1 进销存管理是这个样子的吗? 14.2 中介...

    PHP设计模式之原型模式定义与用法详解

    本文实例讲述了PHP设计模式之原型模式定义与用法。分享给大家供大家参考,具体如下: 原型设计模式(Prototype Design Pattern)很有意思, 因为它使用了一种克隆技术来复制实例化的对象. 新对象是通过复制原型实例来...

    php设计模式 Prototype (原型模式)代码

    php /** * 原型模式 * * 用原型实例指定创建对象的种类.并且通过拷贝这个原型来创建新的对象 * */ abstract class Prototype { private $_id = null; public function __construct($id) { $this-&gt;_id = $id; } ...

    PHP设计模式之原型设计模式原理与用法分析

    PHP有一个内置的克隆方法__clone()可以在设计模式中使用,但是不能直接访问,使用clone关键字即可。克隆不会启动构造函数。 二、什么时候使用原型设计模式 如果一个项目要求你创建某个原型对象的多个实例,就可以...

    GOF23之原型模式

    通过New产生一个对象需要非常繁琐的数据准备或者访问权限,则可以使用原型模式 二、优点: 1、效率高,避免了重新执行构造过程步骤 2、ProtoType类似New,但不同于New,克隆出的对象属性值与原型对象相同,克隆出的...

    Java原型设计模式(Prototype)

     原型模式(Prototype)是通过复制一个已经存在的实例来返回新的实例,而不是新建实例,被复制的实例是我们所称的原型对象,这个原型是可定制的。  2、原理  有两部分组成,抽象原型和具体原型。意图:用原型...

    leetcode分类-DesignPatternAndAlgorithm:常用设计模式和算法,练习用

    leetcode 分类 DesignPatternAndAlgorithm 常用设计模式和算法,练习用。...原型模式:与new一个新对象不同,原型模式是clone出一个新对象。已与java融为一体,实现Cloneable接口。分为深拷贝和浅拷贝。 抽

    JavaScript设计模式之原型模式(Object.create与prototype)介绍

    原型模式说明 说明:使用原型实例来 拷贝 创建新的可定制的对象;新建的对象,不需要知道原对象创建的具体过程; 过程:Prototype =&gt; new ProtoExam =&gt; clone to new Object; 使用相关代码: 代码如下: function ...

    git clone 最新版

    git clone 最新版 不多说上资源 好用测试ok git clong git clone 最新版 不多说上资源 好用测试ok git clong

    Jlink V8固件升级提示Clone的解决方法!

    在使用高版本版KEIL时,提示要升级固件,升级后就出现JLINK is Clone的提示!“the emulator is JLink-Clone, the segger software only support orginal segger device” 然后闪退,IDE崩溃关闭! 解决方案: 1....

    php示例详解Constructor Prototype Pattern 原型模式

    原型模式中主要角色 抽象原型(Prototype)角色:声明一个克隆自己的接口 具体原型(Concrete Prototype)角色:实现一个克隆自己的操作 当一个类大部分都是相同的只有部分是不同的时候,如果需要大量这个类的对象,...

    java Clone

    Clone 属性的相关内容 Clone 属性的相关内容

    windows git 批量 clone 脚本

    支持多个git库clone,提交等常用操作,用户需要根据实际情况微调参数

Global site tag (gtag.js) - Google Analytics