`
GavinZheng
  • 浏览: 16013 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

原型设计模式(Prototype Pattern

 
阅读更多

原型设计模式(Prototype Pattern

 

 

不通过 new 关键字来产生一个对象,而是通过对象拷贝来实现的模式就叫做原型模式。(实现接口Cloneable,重写clone()方法)

 

代码:

Prototype.java

 

package org.prototype;

 

public class Prototype implements Cloneable {

 

    @Override

    protected Prototype clone() {

       // TODO Auto-generated method stub

       Prototype clonePrototype = null;

       try {

           clonePrototype = (Prototype) super.clone();

       } catch (CloneNotSupportedException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

       return clonePrototype;

    }

}

  

 

 

Client.java

package org.prototype;

 

public class Client {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

       // TODO Auto-generated method stub

       Prototype prototype = new Prototype();

       Prototype clonePrototype = prototype.clone();

    }

 

}

 

 

 

注意:

1.      对象拷贝时对象拷贝时类的构造函数是不会被执行的类的构造函数是不会被执行的。

eg: Prototype.java中有构造方法

    public Prototype() {

       System.out.println("调用构造方法");

}

 

 

Client.java并不调用构造方法,仅在New的时候调用。

Prototype clonePrototype = prototype.clone();

 

其输出结果为:调用构造方法

 

2.      浅拷贝和深拷贝问题:在Java Object 类提供的方法 clone 只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址,这种拷贝就叫做浅拷贝。

eg: Prototype.java中有一个数组

    private ArrayList<String> name = new ArrayList<String>();

 

    public ArrayList<String> getName() {

       return name;

    }

 

    public void addName(String name) {

       this.name.add(name);

}

 

 

Client中对数据进行两次设值

       Prototype prototype = new Prototype();

       prototype.addName("张三");

       Prototype clonePrototype = prototype.clone();

       clonePrototype.addName("李四");

    System.out.println(prototype);

 

 

输出结果为:[张三, 李四]

说明调用的是同一个内存地址,解决的办法,在clone方法中对数组或者对象进行拷贝。

           clonePrototype = (Prototype) super.clone();

        clonePrototype.name = (ArrayList<String>)this.name.clone();

 

 

输出结果为:[张三]

 

3.      Clonefinal两对冤家。当Prototype .java中把

private final ArrayList<String> name = new ArrayList<String>()

 

 

 

定义成final时,在clone()方法中使用

clonePrototype.name = (ArrayList<String>)this.name.clone();

 

 

 

       会产生异常

 

原型模式场景使用:

1.      类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等;

2.      通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式;

3.      是一个对象需要提供给其他对象访问,且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。

在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone的方法创建一个对象,然后由工厂方法提供给调用者。

 

原型模式的优点:

1.      性能优良

原型模式是内存二进制的拷贝,比new一个对象性能好多,特别是在一个循环体内产生大量对象时,更能体现其优点

2.      逃避构造函数的约束

这是优点也是缺点,在实际应用时需要考虑。

 

 

  • 大小: 16.1 KB
分享到:
评论

相关推荐

    c++-设计模式之原型模式(Prototype Pattern)

    原型模式(Prototype Pattern)是一种创建型设计模式,允许通过复制现有对象来创建新对象,而不是通过类构造器。这种模式常用于需要频繁创建相似对象的场景,能够提高性能并减少内存使用。 原型模式的组成 原型接口...

    原型设计模式prototype

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

    通过python实现原型模式(Prototype Pattern).rar

    原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有对象来创建新的对象,而不是通过传统的构造函数或类来实例化对象。原型模式在需要创建大量相似对象且创建过程较为耗时或复杂时非常有用。 在...

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

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

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

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

    Prototype Pattern原型模式

    **原型模式(Prototype Pattern)**是一种基于克隆的创建型设计模式,它的主要目的是为了提高创建新对象的效率,特别是当创建新对象的过程复杂或者资源消耗较大时。在原型模式中,一个已经创建的对象(称为原型)被...

    原型模式 Prototype Pattern

    原型模式是一种创建型设计模式,它允许用户通过复制现有的实例来创建新的对象,而不是通过传统的构造器来创建对象。这种模式适用于那些创建对象的成本较高,或者当对象的创建依赖于复杂的环境配置时。通过使用原型...

    原型模式(Prototype Pattern)原理图

    原型模式是一种创建型设计模式,它通过复制一个现有的对象来创建新的对象,而不是通过调用构造函数的方式。这种方式可以在运行时动态地创建和修改对象,而不需要知道具体的创建细节 。 原型模式的基本概念包括以下...

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

    ### .NET设计模式(6):原型模式(Prototype Pattern) #### 概述 在软件工程领域,设计模式提供了一系列经过验证的解决方案,帮助开发者解决常见的软件设计问题。本篇文章聚焦于.NET框架下的“原型模式”...

    设计模式之原型模式

    **原型模式(Prototype Pattern)**是一种创建型设计模式,它提供了一种创建对象的最佳方式,特别是在需要大量相似对象时,可以显著提高效率。在C#中,原型模式允许我们通过复制现有的对象来创建新对象,而不是通过...

    android设计模式之原型模式

    本文将深入探讨Android设计模式中的“原型模式”(Prototype Pattern),并结合提供的"prototype"压缩包中的示例代码进行解析。 原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而...

    iOS设计模式-原型设计模式

    本文将详细探讨"原型设计模式"(Prototype Design Pattern)及其在iOS中的应用。 原型设计模式是一种创建型设计模式,它通过复制已有对象来创建新对象,而不是通过构造函数或者工厂方法。这种模式主要用于减少创建...

    设计模式_原型模式.zip

    原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当...

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

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

    Prototype模式

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

    iOS设计模式之原型模式

    本文将深入探讨一种常见的设计模式——原型模式(Prototype Pattern),并结合具体的iOS应用场景进行解析。 原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而不是通过构造函数来创建...

    iOS设计模式之原型设计模式

    原型模式(Prototype Pattern)是其中的一种,它的主要目的是通过克隆已有对象来创建新对象,而不是从头开始创建,从而提高效率和代码的可维护性。在iOS中,我们可以利用Objective-C的NSCopying协议或Swift的...

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

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

    设计模式——原型模式

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

Global site tag (gtag.js) - Google Analytics