`

原型模式——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
分享到:
评论

相关推荐

    设计模式——原型模式

    在原型模式中,首先需要定义一个接口或抽象类,这个接口或抽象类通常叫做`Prototype`,它声明了一个`clone()`方法,用于返回对象的一个副本。例如: ```java public interface Prototype { Prototype clone(); ...

    原型模式实践代码

    标签中的"Clone"指的是这个实践代码是关于对象复制的,也就是原型模式的核心——克隆操作。 在Text0313文件中,可能包含了实现上述原型模式的完整Java代码示例,可能还涉及了如何处理深拷贝、异常处理以及如何在...

    设计模式之原型模式

    3. **深拷贝与浅拷贝**:原型模式中的拷贝分为两种类型——深拷贝和浅拷贝。深拷贝会创建原始对象的所有属性的新副本,包括引用类型。而浅拷贝只复制对象本身,不复制引用的对象。 ### 实现原型模式的步骤 1. 定义...

    原型模式PPT文档

    1. **模式结构**:原型模式主要由两个角色构成——原型(Prototype)接口和具体原型(Concrete Prototype)。原型接口定义了克隆操作,而具体原型实现该接口,提供实际的克隆功能。 2. **工作原理**:首先,客户端...

    Java 23种设计模式08原型模式.pdf

    以下是一个简单的原型模式应用实例——邮件复制,该实例演示了如何使用浅克隆技术来复制邮件对象。 ```java // 定义一个邮件类,实现Cloneable接口 public class Email implements Cloneable { private String ...

    C#面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式)

    今天我们将深入探讨其中的一种创建型模式——原型模式(Prototype Pattern)。原型模式主要用于简化实例化过程,通过克隆已有对象来创建新对象,而不是每次都创建全新的实例。在C#中,我们可以通过实现`ICloneable`...

    C#视频-面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式)

    在本课程中,我们将深入探讨C#编程中的一个重要设计模式——Prototype原型模式,它是创建型设计模式的一种。原型模式主要用于简化实例化过程,通过复制已有对象来创建新对象,而不是直接通过构造函数来创建。这一...

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

    为了满足特殊要求——所有数据必须保持同一版本且更新过程中系统A不能停机,我们可以利用原型模式来实现。 **原型模式的应用** - **对象创建成本大**:这里的成本大不在于内存分配和初始化,而在于从数据库或慢速IO...

    .NET设计模式(6):原型模式(PrototypePattern)

    接下来,我们将通过一个具体的示例——调色板应用,来深入理解原型模式的应用场景及其实现细节。 假设我们需要设计一个调色板应用程序,用户可以通过点击调色板上的某个方块来获取对应颜色的信息。为了实现这一功能...

    C#面向对象设计模式纵横谈(5)

    今天我们将深入探讨一种创建型设计模式——原型模式(Prototype Pattern)。 原型模式是一种结构型设计模式,它允许我们通过复制现有对象来创建新对象,而不是从头开始创建。这种模式主要用于减少创建新对象的复杂...

    java_clone用法

    1. **设计模式需求**:GoF设计模式中的“原型模式”鼓励使用现有的实例作为原型来创建新的对象实例。这种情况下,`clone`方法非常有用。 2. **对象隔离**:有时,我们希望复制的对象与原对象完全隔离,即修改一个...

    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设计模式 Prototype (原型模式)代码

    这使得克隆后的对象与原对象有所区别,符合原型模式的基本思想——创建一个与原始对象具有相同属性和状态的新对象。 `getClone()`方法是为用户提供一个简便的接口,可以直接调用来克隆当前对象,返回一个与之相同但...

    prototype.rar

    本文将深入探讨Java设计模式中的一个关键概念——原型模式(Prototype Pattern)。原型模式是一种创建型设计模式,它允许我们通过复制已有对象来创建新对象,而不是通过传统的方式从头构建。这种模式特别适用于当...

    java的设计模式 《设计模式-java语言中的应用.pdf》

    Java中的`Cloneable`接口和`Object`类的`clone()`方法支持原型模式的实现。 6. **适配器模式**:将一个类的接口转换成客户希望的另一个接口。在Java中,可以使用类适配器或接口适配器,使不兼容的接口能够协同工作...

    设计模式

    以上介绍了三种常用的设计模式——单例模式、构建者模式和原型模式,每种模式都有其特定的应用场景。理解并熟练掌握这些设计模式有助于提升代码质量和系统的灵活性。在实际开发中,可以根据项目的具体需求选择合适的...

    设计模式--Java语言版本

    《设计模式——Java语言版本》这本书深入探讨了如何在Java环境下应用这些模式。 在“设计模式--Java语言版本”中,我们可以期待学习到以下关键知识点: 1. **单例模式**:确保一个类只有一个实例,并提供一个全局...

    C++设计模式.pdf

    ### C++设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 0. 引言 设计模式是面向对象编程领域的重要组成部分,它为解决常见的设计问题提供了一系列标准化的解决方案。GoF(四人组)提出的23种设计模式被...

    C#全能速查宝典

    1.1.19 typeof运算符——获得系统原型对象的类型 21 1.1.20 using关键字——引入命名空间 22 1.1.21 WriteLine方法——写入流 23 1.2 数学方法类——Math 25 1.2.1 Abs方法——返回指定数字的绝对值 25 1.2.2 Acos...

    222018321062006-宋行健-实验31

    1. **原型模式**:在Coin类中应用了原型模式,以实现对象的深复制。GameManager类中,Coin的原型被创建,然后在refresh()方法中通过深复制生成新的Coin对象。深复制确保了复制的对象与原对象独立,不会因修改复制...

Global site tag (gtag.js) - Google Analytics