设计模式之禅学习——原型模式
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()); } }
这样运行后只有:
[张三]
相关推荐
在原型模式中,首先需要定义一个接口或抽象类,这个接口或抽象类通常叫做`Prototype`,它声明了一个`clone()`方法,用于返回对象的一个副本。例如: ```java public interface Prototype { Prototype clone(); ...
标签中的"Clone"指的是这个实践代码是关于对象复制的,也就是原型模式的核心——克隆操作。 在Text0313文件中,可能包含了实现上述原型模式的完整Java代码示例,可能还涉及了如何处理深拷贝、异常处理以及如何在...
3. **深拷贝与浅拷贝**:原型模式中的拷贝分为两种类型——深拷贝和浅拷贝。深拷贝会创建原始对象的所有属性的新副本,包括引用类型。而浅拷贝只复制对象本身,不复制引用的对象。 ### 实现原型模式的步骤 1. 定义...
1. **模式结构**:原型模式主要由两个角色构成——原型(Prototype)接口和具体原型(Concrete Prototype)。原型接口定义了克隆操作,而具体原型实现该接口,提供实际的克隆功能。 2. **工作原理**:首先,客户端...
以下是一个简单的原型模式应用实例——邮件复制,该实例演示了如何使用浅克隆技术来复制邮件对象。 ```java // 定义一个邮件类,实现Cloneable接口 public class Email implements Cloneable { private String ...
今天我们将深入探讨其中的一种创建型模式——原型模式(Prototype Pattern)。原型模式主要用于简化实例化过程,通过克隆已有对象来创建新对象,而不是每次都创建全新的实例。在C#中,我们可以通过实现`ICloneable`...
在本课程中,我们将深入探讨C#编程中的一个重要设计模式——Prototype原型模式,它是创建型设计模式的一种。原型模式主要用于简化实例化过程,通过复制已有对象来创建新对象,而不是直接通过构造函数来创建。这一...
为了满足特殊要求——所有数据必须保持同一版本且更新过程中系统A不能停机,我们可以利用原型模式来实现。 **原型模式的应用** - **对象创建成本大**:这里的成本大不在于内存分配和初始化,而在于从数据库或慢速IO...
接下来,我们将通过一个具体的示例——调色板应用,来深入理解原型模式的应用场景及其实现细节。 假设我们需要设计一个调色板应用程序,用户可以通过点击调色板上的某个方块来获取对应颜色的信息。为了实现这一功能...
今天我们将深入探讨一种创建型设计模式——原型模式(Prototype Pattern)。 原型模式是一种结构型设计模式,它允许我们通过复制现有对象来创建新对象,而不是从头开始创建。这种模式主要用于减少创建新对象的复杂...
1. **设计模式需求**:GoF设计模式中的“原型模式”鼓励使用现有的实例作为原型来创建新的对象实例。这种情况下,`clone`方法非常有用。 2. **对象隔离**:有时,我们希望复制的对象与原对象完全隔离,即修改一个...
13.3.2 原型模式的使用场景 13.4 原型模式的注意事项 13.4.1 构造函数不会被执行 13.4.2 浅拷贝和深拷贝 13.4.3 clone与final两个冤家 13.5 最佳实践 第14章 中介者模式 14.1 进销存管理是这个样子的吗? 14.2 中介...
这使得克隆后的对象与原对象有所区别,符合原型模式的基本思想——创建一个与原始对象具有相同属性和状态的新对象。 `getClone()`方法是为用户提供一个简便的接口,可以直接调用来克隆当前对象,返回一个与之相同但...
本文将深入探讨Java设计模式中的一个关键概念——原型模式(Prototype Pattern)。原型模式是一种创建型设计模式,它允许我们通过复制已有对象来创建新对象,而不是通过传统的方式从头构建。这种模式特别适用于当...
Java中的`Cloneable`接口和`Object`类的`clone()`方法支持原型模式的实现。 6. **适配器模式**:将一个类的接口转换成客户希望的另一个接口。在Java中,可以使用类适配器或接口适配器,使不兼容的接口能够协同工作...
以上介绍了三种常用的设计模式——单例模式、构建者模式和原型模式,每种模式都有其特定的应用场景。理解并熟练掌握这些设计模式有助于提升代码质量和系统的灵活性。在实际开发中,可以根据项目的具体需求选择合适的...
《设计模式——Java语言版本》这本书深入探讨了如何在Java环境下应用这些模式。 在“设计模式--Java语言版本”中,我们可以期待学习到以下关键知识点: 1. **单例模式**:确保一个类只有一个实例,并提供一个全局...
### C++设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 0. 引言 设计模式是面向对象编程领域的重要组成部分,它为解决常见的设计问题提供了一系列标准化的解决方案。GoF(四人组)提出的23种设计模式被...
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...
1. **原型模式**:在Coin类中应用了原型模式,以实现对象的深复制。GameManager类中,Coin的原型被创建,然后在refresh()方法中通过深复制生成新的Coin对象。深复制确保了复制的对象与原对象独立,不会因修改复制...