`
fengzl
  • 浏览: 216417 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

原型创建模式

阅读更多
http://www.iteye.com/topic/72152


老板说:“给我盖一座大楼。”

工程师说:“盖什么样的大楼呢?”

老板指着身后的一座楼说:“和那个一模一样的。”

从老板的角度来讲,他采用的就是,Prototype模式,即原型模式。否则,他需要再花费一些时间和工程师一点一点的探讨关于大楼的一些设计问题。

所谓的原型模式,就是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

JAVA的Object.clone()的存在,使得这个模型的学习变得简单了许多。

一.搭桥过河
过河是一门大学问

首先研究一下JAVA的clone技术。

我理解的很简单,无非是把一个对象进行复制粘贴。那么,来看一下JAVA语言中是如何来实现的这个步骤的。我们依次需要知道以下这些事。

1.Object对象中有一个clone()方法。而且是protected。

2.继承于Object的类一般都可以实现这个方法(有特殊的,比如StringBuffer等,官方定的,不去研究它)。

3.想被clone的对象需要实现接口Cloneable。如果此对象的类不能实现接口Cloneable,则会抛出CloneNotSupportedExcetion。

4.所有的数组都被视为实现接口Cloneable。

5.clone分为浅clone(又称影子clone)和深clone。

6.Object类本身不实现接口Cloneable,所以在类为Object的对象上调用clone方法,将会导致在运行时抛出异常。

首先来看一个能够实现clone类的小例子。
//本文代码参考于http://blog.csdn.net/tiewen/archive/2005/08/05/446301.aspx
class CloneClass implements Cloneable {
    
public int aInt;

    
public Object clone() {
        CloneClass o 
= null;
        
try {
            o 
= (CloneClass) super.clone();
        }
 catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        
return o;
    }

}

至于浅clone和深clone,无非就是一个程度问题。再来看一个例子。
class UnCloneA {
    
private int i;

    
public UnCloneA(int ii) {
        i 
= ii;
    }


    
public void doublevalue() {
        i 
*= 2;
    }


    
public String toString() {
        
return Integer.toString(i);
    }

}


class CloneB implements Cloneable {
    
public int aInt;

    
public UnCloneA unCA = new UnCloneA(111);

    
public Object clone() {
        CloneB o 
= null;
        
try {
            o 
= (CloneB) super.clone();
        }
 catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        
return o;
    }

}


class CloneMain {
    
public static void main(String[] a) {
        CloneB b1 
= new CloneB();
        b1.aInt 
= 11;
        System.out.println(
"before clone,b1.aInt = " + b1.aInt);
        System.out.println(
"before clone,b1.unCA = " + b1.unCA);
        CloneB b2 
= (CloneB) b1.clone();
        b2.aInt 
= 22;
        b2.unCA.doublevalue();
        System.out.println(
"=================================");
        System.out.println(
"after clone,b1.aInt = " + b1.aInt);
        System.out.println(
"after clone,b1.unCA = " + b1.unCA);
        System.out.println(
"=================================");
        System.out.println(
"after clone,b2.aInt = " + b2.aInt);
        System.out.println(
"after clone,b2.unCA = " + b2.unCA);
    }

}


输出结果为:
/** RUN RESULT:
before clone,b1.aInt = 11
before clone,b1.unCA = 111
=================================
after clone,b1.aInt = 11
after clone,b1.unCA = 222
=================================
after clone,b2.aInt = 22
after clone,b2.unCA = 222
*/

可见,当执行clone这个动作的时候,系统首先开辟一个和它一样的空间。然后分别对其内容进行复制。复制过程中,如果是基本类型,没什么说的,直接把值复制过来。如果不是基本类型,复制的则是该类型对象的引用。

这 样的clone就是所谓的浅clone。那很显然,如果上面复制的过程中,对于非基本类型实现的不是一个引用复制,而是创建一个新的一样的对象(其实也是 一个clone步骤),那么就是所谓的深clone。对于深度克隆只不过是clone的一种扩展,还有N深clone等等。对于这些,和我们要研究的原型 模式没有多少关系。不想去研究。


关于JAVA的clone技术,对我来说,理解这些就够了。其它的,就是进一步的扩展及应用。

二.以长克短
什么时候会想到用原型模式呢


这个我们学习任何一项技术都要问自己的问题。


要用它,就要知道它的优点。合理的利用它的优点来为我们服务。做人也一样,不要总拿自己的短处去比别人的长处。要知道,每个人都是不一样的,每个人都有自己的长处和短处。这就是以长克短。

JAVA中的clone方法,其实现是native的。这也就意味着它的执行效率是远高于new一个新对象的。所以,当需要生成大量相似对象的时候,可以考虑下应用clone,也就是原形模式。

我的项目经验几乎为0,单纯从理解的角度去想的。

至于其它的应用,还有待前辈们指点。我再不断补充。
分享到:
评论

相关推荐

    原型模式实践代码

    原型模式是一种设计模式,主要应用于软件工程领域,用于创建重复的对象,而无需再次进行实例化。在Java、C#等面向对象的语言中,原型模式通过实现`Cloneable`接口或使用序列化机制来实现对象的复制。在这个"原型模式...

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

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

    创建型模式之原型模式(Prototype Pattern)

    在软件设计中,原型模式是一种创建型设计模式,它提供了一种通过复制已有对象来创建新对象的方式,避免了重复的构造过程,提高了代码的效率和可维护性。原型模式的核心思想是利用对象的克隆功能来实现新对象的创建,...

    原型设计模式prototype

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

    设计模式之原型模式

    **原型模式(Prototype Pattern)**是软件设计模式中的结构型模式之一,主要用来简化实例化过程,减少类的创建。在原型模式中,一个对象可以被用作创建其他新对象的模板,通过复制已有对象来创建新对象,而不是通过new...

    android设计模式之原型模式

    原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而不是通过构造函数来创建。这种模式可以有效地减少对象创建时的开销,尤其是在需要创建大量相似对象的情况下。在Android中,原型模式...

    原型模式PPT文档

    5. **与其他模式的结合**:原型模式可以和工厂模式结合使用,工厂模式负责创建原型对象,而原型模式则负责克隆这些对象,提供更灵活的扩展。 6. **示例代码**:PPT可能还包含了Java或其他语言的示例代码,展示如何...

    iOS设计模式之原型模式

    原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而不是通过构造函数来创建。这种模式适用于对象创建成本较高或者初始化过程复杂的情况,通过克隆已存在的对象,可以显著提升效率。 在...

    设计模式——原型模式

    原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而无需知道具体创建过程的细节。这种模式的核心在于,它提供了一种对象克隆的简便方法,使得对象的创建过程对用户...

    设计模式之原型模式Java实现和类设计图

    原型模式(Prototype Pattern)是其中一种行为设计模式,主要用于对象创建。它通过复制已有对象来创建新对象,而不是通过传统的构造函数来创建。在Java中,原型模式可以有效地提高性能,特别是在创建复杂对象时。 #...

    设计模式的原型模式的例子

    原型模式(Prototype Pattern)是软件设计模式中的一种结构型模式,它的主要目的是通过复制已有对象来创建新对象,从而减少创建新对象的成本。在原型模式中,类的实例化过程被替换为对已有实例的克隆操作,尤其适用...

    [创建型模式]设计模之原型模式(Prototype Pattern)

    **原型模式(Prototype Pattern)**是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而不是通过构造函数或工厂方法。这种模式的核心在于,它提供了一种更高效、更灵活的方式来创建新实例,特别是在...

    设计模式专题之(五)原型模式---设计模式原型模式示例代码(python--c++)

    原型模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在原型模式中,一个对象可以被克隆以创建新对象,而无需知道具体的创建细节。这种模式在需要重复创建相似对象时非常有用,避免了每次创建新对象时都...

    实验六:原型模式.rar

    原型模式是其中一种经典的设计模式,它属于创建型模式,主要应用于对象复制或克隆场景。在这个实验六:“原型模式.rar”中,我们将深入理解并实践如何在Java中实现原型模式。 首先,原型模式的核心思想是通过拷贝已...

    设计模式C++学习之原型模式(Prototype)

    原型模式是一种创建型设计模式,它的核心思想是通过复制已有对象来创建新对象,而不是通过构造函数来全新创建。这种模式在需要频繁创建和删除对象的场景中尤其有效,因为它可以显著减少内存分配和释放的操作,提升...

    java 原型模式

    Java原型模式是一种设计模式,属于创建型模式,它允许我们通过复制现有的对象来创建新对象,而无需知道具体创建过程的细节。这种模式的核心在于Java中的`Cloneable`接口和`clone()`方法。 首先,我们要了解`...

    设计模式_创建型_原型模式.md

    原型模式是创建型设计模式中的一种,用于创建重复的对象,同时又能保证性能。这种模式实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的成本过于高昂时,原型模式就显得尤为重要。 **原型模式的...

    原型模式prototype

    **原型模式(Prototype)**是软件设计模式中的一种,它属于创建型模式,主要用于简化对象的创建过程,通过复制已有对象来生成新对象,避免了重复的构造过程,提高了代码的效率和可维护性。在Java、C#等面向对象语言...

Global site tag (gtag.js) - Google Analytics