`
GavinZheng
  • 浏览: 15211 次
  • 性别: 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
分享到:
评论

相关推荐

    原型模式 Prototype Pattern

    原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    Prototype Pattern原型模式

    原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    原型模式(Prototype Pattern)原理图

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

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

    NULL 博文链接:https://jacky-dai.iteye.com/blog/2295379

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

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

    设计模式_原型模式.zip

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

    C#版 24种设计模式

    适配器模式(Adapter Pattern) 提供者模式(Provider Pattern) 外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 原型模式(Prototype Pattern) 责任链模式(Chain of Responsibility Pattern) 中介者模式...

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

    设计模式PPT

     原型模式(Prototype Pattern)  单例模式(Singleton Pattern) 结构型模式用来处理类或者对象的组合,主要包含以下7种设计模式:  适配器模式(Adapter Pattern)  桥接模式(Bridge Pattern)  组合...

    33种JAVA设计模式DEMO

    原型模式(Prototype Pattern) 2 结构型模式 这些设计模式关注类和对象的组合。继承的概念被用来组合接口和定义组合对象获得新功能的方式。 适配器模式(Adapter Pattern) 桥接模式(Bridge Pattern) 过滤器模式...

    Python设计模式之原型模式实例详解

    本文实例讲述了Python设计模式之原型模式。分享给大家供大家参考,具体如下: 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 一个原型模式的简单demo: #!/usr/bin/...

    Java设计模式,并加上个人理解

    1. 设计模式 1.1 含义 1.2 作用 1.3 设计原则 1.4 分类 2. 简单工厂模式 (SimpleFactoryPattern) 3. 工厂方法模式 (Factory Method) 4. 单例模式 (Singleton) 5. 抽象工厂模式 (Abstract Factory) 6. ...

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm” 供参考。 注:项目在 VS2008 下使用。 创建型: 抽象工厂模式(Abstract Factory) ...

    C#设计模式_设计模式_C#_

    原型模式(Prototype)结构型: 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 装饰模式(Decorator Pattern) 9. 组合模式(Composite Pattern) 10. 外观模式(Facade Pattern) 11. 享元模式...

    设计模式面面观(10):桥接模式(Bridge Pattern)-结构型模式

    (100%) 设计模式面面观(5):抽象工厂模式(AbstractFactory)-创建型模式 (100%) 设计模式面面观(6):生成器模式(Builder)-创建型模式 (100%) 设计模式面面观(7):原型模式(Prototype)-...

    23种设计模式的基本介绍

    创建型模式(Creational Pattern) 1、 抽象工厂模式(Abstract Factory Pattern) 介绍 提供一个创建...3、 原型模式(Prototype Pattern) 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。。。。

    32种设计模式

    C# 32种设计模式: 创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) ...

    java设计模式源码-DesignPattern:设计模式(Java实现源码)

    原型模式(prototypePattern) 适配器模式(adapterPattern) 桥接模式(bridgePattern) 过滤器模式(filterPattern) 组合模式(compositePattern) 装饰器模式(decoratorPattern) 外观模式(facadePattern) 享元模式...

Global site tag (gtag.js) - Google Analytics