`
eimhee
  • 浏览: 2167920 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Prototype设计模式

    博客分类:
  • JAVA
阅读更多

在软件开发中,有时候可能会需要创建一些特别复杂的对象,如果系统中已经存在同样类型的对象,并且不同的属性个数相差不大的话,用Prototype模式可能是一个理想的选择。

定义 :用原型实例指定创建物件的种类,并且通过拷贝这些原型创建新的物件。

Prototype 模式允许一个物件再创建另外一个可定制的物件,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型物件传给那个要发动创建的物件,这个要发动创建的物件通过请求原型物件拷贝它们自己来实施创建。

类图如下:

Prototype


从图上可以看出,使用方法很简单,只要调用对象的clone方法返回一个新的对象就可以了。但是为什么没有其他新的方法来实现这个模式呢?因为Java中的Object提供了clone()方法来实现对象的克隆,所以Prototype模式实现一下子变得很简单.

在这个clone方法中,我们只要调用Object的克隆方法返回一个对象,就可以以最简单的方式实现Prototype模式。

在其他编程语言中,就需要创建一个当前类的新的对象,然后把当前对象本身的各属性的值复制一份给新创建的对象,并且返回新对象即可。


从上图中的main函数的调用过程来看,也可以很清晰地看出Prototype模式和其他创建型模式的不同:Prototype模式创建对象不是通过new一个类,而是通过一个现有的对象实例来的。

什么时候应该使用prototype模式呢? 
1.当你要创建的对象与现有运行时对象相似度很大时
2.为了避免创建类的工厂类导致层次复杂度增加时
3.当类的实例只有不多的几种状态时(此时需要引进原型管理器)

Prototype模式常用在一些对象管理器中。这些对象管理器本身一般为单例模式,主要负责对象的创建和返回。由于返回的对象的类型基本上是一致的,而且返回的对象的各项属性大多保持一致,只有极少数属性才需要修改,所以用Prototype无疑是极好的选择。

需要注意的是:浅拷贝和深拷贝的区别。

简单的讲,浅拷贝就是只对当前对象的直属属性进行复制,如果其属性是基本类型的话,就复制原对象的值;如果其属性是其他对象的话,就复制对象的地址。而深拷贝则是麻烦的多,如果其属性是对象的话,就需要创建一个新的子属性的对象,并且对这个对象的各项属性进行复制,如果子属性还有子属性的话,则需要递归的进行复制操作。

一切就看需求,如果那些属性的值不会被变更的话,那么只需要实现浅拷贝即可;否则,深拷贝就是必须的。

ProtoType uml


package com.kingswood.pattern.creational.protoType;  
  
public interface ProtoType extends Cloneable {  
  
    public Object clone();  
  
}  
 

package com.kingswood.pattern.creational.protoType;  
  
public class ConcreteProtoType implements ProtoType {  
  
    private String propA;  
  
    private String propB;  
  
    public String getPropA() {  
        return propA;  
    }  
  
    public void setPropA(String propA) {  
        this.propA = propA;  
    }  
  
    public String getPropB() {  
        return propB;  
    }  
  
    public void setPropB(String propB) {  
        this.propB = propB;  
    }  
  
    public Object clone(){  
        try {  
            return super.clone();  
        } catch (CloneNotSupportedException e) {  
            return null;  
        }  
    }  
  
} 
 

package com.kingswood.pattern.creational.protoType;  
  
import junit.framework.TestCase;  
  
public class Client extends TestCase {  
  
    public static void testMethod(){  
  
        ConcreteProtoType proto = new ConcreteProtoType();  
  
        proto.setPropA("propA");  
  
        proto.setPropB("propB");  
  
        ConcreteProtoType newProto = (ConcreteProtoType) proto.clone();  
  
        assertNotSame(proto, newProto);  
  
        assertEquals(proto.getPropA(), newProto.getPropA());  
  
        assertEquals(proto.getPropB(), newProto.getPropB());  
  
    }  
}  
 
以上样例使用浅克隆方式实现proto type模式,浅克隆无法对对象中包含的其他非java原是类型数据进行复制。如果需要复制其他非java原是类型数据,则需要使用深克隆方式,对象以及其内部所有对象必须实现java.io.Serializable接口,clone方法改写成以下形式:


public Object clone(){  
  
        try {  
  
            ByteArrayOutputStream ot = new ByteArrayOutputStream();  
  
            ObjectOutputStream oo = new ObjectOutputStream(ot);  
  
            oo.writeObject(this);  
  
            ByteArrayInputStream it = new ByteArrayInputStream(ot.toByteArray());  
  
            ObjectInputStream oi = new ObjectInputStream(it);  
  
            return (oi.readObject());  
  
        } catch (IOException e) {  
            e.printStackTrace();  
            return null;  
        } catch (ClassNotFoundException e) {  
            e.printStackTrace();  
            return null;  
        }  
  
    }  
 

9
4
分享到:
评论

相关推荐

    设计模式之Prototype(原型)

    总的来说,Prototype设计模式是软件设计中一种高效且灵活的对象创建策略。通过复制已有对象,避免了重复的初始化过程,降低了系统开销。了解并熟练掌握这种模式,将有助于提升我们设计和编写高质量代码的能力。

    设计模式之Prototype

    总结来说,Prototype设计模式是一种强大的工具,它允许我们在运行时动态地创建对象,同时保持代码的简洁性和可维护性。对于需要频繁创建类似对象的场景,它是一个值得考虑的选择。通过深入理解和熟练应用Prototype...

    原型设计模式prototype

    **原型设计模式(Prototype Pattern)**是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而不是通过构造函数来实例化新对象。在面向对象编程中,当我们需要频繁地创建具有相同或相似属性的对象时,...

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

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

    23种设计模式之Prototype模式代码

    **原型模式(Prototype模式)**是软件设计模式中的一个经典模式,属于创建型模式。它提供了一种通过复制现有的对象来创建新对象的方式,而无需知道具体创建过程的细节。这种模式在需要频繁创建相似对象时非常有用,...

    Prototype整理的学习资料

    下面将从Prototype设计模式的基本概念、在JavaScript中的应用、与Ajax的关系以及如何与其他技术如Java和JavaScript库交互等方面进行深入阐述。 1. **Prototype设计模式** Prototype设计模式是一种对象创建型设计...

    用UML描述C++设计模式

    本知识点主要以 Adapter、Abstract Factory、Singleton、Bridge 和 Prototype 设计模式为例,结合UML来说明如何使用UML来描述这些设计模式。 **Adapter设计模式** Adapter 模式(适配器模式),主要用于两个不兼容...

    -----

    【标签】:设计模式,面向对象,MVC,GoF,Template Method,Singleton,Factory,Abstract Factory,Prototype 设计模式是软件开发中的一种经验总结,它们描述了解决常见问题的有效方法。这些模式提供了一种标准化...

    设计模式在Drawcli程序中的应用

    **Prototype设计模式** 的核心思想是在创建对象时,不是直接创建新的实例,而是通过拷贝一个已存在的实例(即Prototype)来生成新对象。这种方式简化了对象的创建过程,并且可以有效地减少内存开销。在Drawcli程序中...

    Prototype模式

    **原型模式(Prototype Pattern)**是一种创建型设计模式,它提供了一种通过复制已有对象来创建新对象的方式,而不是通过构造函数。在某些情况下,当创建新对象的成本非常高时(例如,对象需要大量的初始化操作或者从...

    JAVA设计模式chm文档

    设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator...

    JavaScript设计模式与开发实践.pdf

    第二部分是核心部分,通过一步步完善的代码示例,由浅入深地讲解了16个设计模式,包括 singleton模式、Factory模式、Abstract Factory模式、Builder模式、Prototype模式、Adapter模式、Bridge模式、Composite模式、...

    小D深入浅出设计模式+框架源码剖析实战

    ├─第一章 旭瑶-小滴...│ 5.1-创建型设计模式-Prototype原型设计模式实战《上》.mp4 │ 5.2-创建型设计模式-Prototype原型设计模式实战《下》.mp4 │ 6.1-接口之间的桥梁-适配器设计模式你知道多少.mp4 │ 6.4

    23种设计模式整理pdf

    设计模式详解 设计模式是软件开发中的一种解决方案,旨在提高代码的可重用性、可维护性和可扩展性。在这篇文章中,我们将对23种常见的设计模式进行整理和解释。 1. Singleton 模式 Singleton 模式是一种创建型模式...

    设计模式 t05Prototype

    "设计模式 t05Prototype" 标题暗示我们将讨论的是原型(Prototype)设计模式,它是创建型设计模式的一种,主要用在对象复制或克隆的场景。 原型模式的核心思想是通过复制一个已经存在的对象来创建新对象,而不是...

    C++设计模式代码资源10_prototype.zip

    "原型(Prototype)"设计模式是其中的一种,它允许我们通过复制已有对象来创建新对象,而不是通过传统的构造函数方式创建。这个"C++设计模式代码资源10_prototype.zip"压缩包显然包含了关于C++实现原型模式的示例...

    解析设计模式中的Prototype原型模式及在C++中的使用

    原型模式的意图是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 适用性  当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者 为了避免创建一个与产品类层次平行的工厂类层次时;...

    java模式,设计模式,多种设计模式

    ### Java设计模式详解 #### 一、引言 自从J2EE(Java 2 Enterprise Edition)的出现,Java的企业级应用程序开发得到了极大的简化。然而,随着J2EE在各行各业中的广泛应用,开发人员逐渐意识到需要一种更为系统化的...

    23种面向对象设计模式

    面向对象设计模式是软件开发中的一种重要思想,它通过总结和提炼在软件设计过程中常见的问题和解决方案,形成了可复用的设计规范。标题提到的“23种面向对象设计模式”涵盖了设计模式的主要分类,这些模式在Java、...

    C#面向对象设计模式纵横谈(视频与源码)

    C#面向对象设计模式纵横谈(6):Prototype 原型模式(创建型模式) C#面向对象设计模式纵横谈(7):Adapter 适配器模式(结构型模式) C#面向对象设计模式纵横谈(8):Bridge 桥接模式(结构型模式) C#面向对象设计...

Global site tag (gtag.js) - Google Analytics