克隆模式

(参考:http://www.cnblogs.com/java-my-life/archive/2012/04/11/2439387.htmlhttp://blog.csdn.net/jason0539/article/details/23158081http://blog.csdn.net/zhangjg_blog/article/details/18369201

  原型模式要求对象实现一个可以“克隆”自身的接口,这样就可以通过复制一个实例对象本身来创建一个新的实例。这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再去通过new来创建。

原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:

  • 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。
  • 重写Object类中的clone方法。Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。

原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。在实际应用中,原型模式很少单独出现。经常与其他模式混用,他的原型类Prototype也常用抽象类来替代。

使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。使用原型模式的另一个好处是简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。

原型模式的注意事项

  • 使用原型模式复制对象不会调用类的构造方法。因为对象的复制是通过调用Object类的clone方法来完成的,它直接在内存中复制数据,因此不会调用到类的构造方法。不但构造方法中的代码不会执行,甚至连访问权限都对原型模式无效。单例模式中,只要将构造方法的访问权限设置为private型,就可以实现单例。但是clone方法直接无视构造方法的权限,所以,单例模式与原型模式是冲突的,在使用时要特别注意。
  • 深拷贝与浅拷贝。Object类的clone方法只会拷贝对象中的基本的数据类型(8种基本数据类型byte,char,short,int,long,float,double,boolean),对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝

/**
 * Project Name:DesignPatterns
 * File Name:Prototype.java
 * Package Name:com.louis.clone
 * Date:2017年9月27日上午8:42:25
 * Copyright (c) 2017, [email protected] All Rights Reserved.
 *
*/

package com.louis.clone;
/**
 * ClassName:Prototype
 * Function: TODO ADD FUNCTION.
 * Reason:     TODO ADD REASON.
 * Date:     2017年9月27日 上午8:42:25
 * @author   michael
 * @version
 * @since    JDK 1.7
 * @see
 */
public class Prototype implements Cloneable{

    public Prototype clone(){
        Prototype prototype = null;
        try {
            prototype = (Prototype)super.clone();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return prototype;
    }
}
/**
 * Project Name:DesignPatterns
 * File Name:ConcretePrototype.java
 * Package Name:com.louis.clone
 * Date:2017年9月27日上午8:46:44
 * Copyright (c) 2017, [email protected] All Rights Reserved.
 *
*/

package com.louis.clone;
/**
 * ClassName:ConcretePrototype
 * Function: TODO ADD FUNCTION.
 * Reason:     TODO ADD REASON.
 * Date:     2017年9月27日 上午8:46:44
 * @author   michael
 * @version
 * @since    JDK 1.7
 * @see
 */
public class ConcretePrototype extends Prototype{
    public void show(){
        System.out.println("原型模型实现");
    }
}
/**
 * Project Name:DesignPatterns
 * File Name:Client.java
 * Package Name:com.louis.clone
 * Date:2017年9月27日上午8:47:35
 * Copyright (c) 2017, [email protected] All Rights Reserved.
 *
*/

package com.louis.clone;
/**
 * ClassName:Client
 * Function: TODO ADD FUNCTION.
 * Reason:     TODO ADD REASON.
 * Date:     2017年9月27日 上午8:47:35
 * @author   michael
 * @version
 * @since    JDK 1.7
 * @see
 */
public class Client {
    public static void main(String[] args) {
        ConcretePrototype cp = new ConcretePrototype();
        for (int i = 0; i < 10; i++) {
            ConcretePrototype clonecp = (ConcretePrototype)cp.clone();
            clonecp.show();
        }
    }
}

时间: 2024-09-30 05:53:35

克隆模式的相关文章

Horizon7发布完整克隆模式后,无法登录问题

问题描述:通过完整克隆模式发布后,发现,登录的时候无法使用域账户登录系统. 解决方法:后来发现自定义配置文件,没有设置自动加域,更改后重新发布即可.

基于原型机制的克隆模式

在传统的静态语言中,类相当于“模子”,用class来定义,而实例相当于“模具”,就是说实例是通过“模子”class来生成的.但是在js中,并没有class关键字,换句话说js中没有类的概念.但得益于js强大的原型机制,js是可以模拟静态语言中的类的. 先来看看函数对象Function,对象Function上拥有一个原型对象prototype,即 Function.prototype = { call:function(){}, apply:function(){}, ...... __proto

Java 原型模式(克隆模式)

  Java 的设计模式有 23 种,前段时间小编已经介绍了单例模式,由于我们在学习 Spring 的时候在 bean 标签的学习中碰到了今天要讲的原型模式,那么小编就已本文来介绍下原型模式. 原型模式  在java中我们知道通过new关键字创建的对象是非常繁琐的(类加载判断,内存分配,初始化等),在我们需要大量对象的情况下,原型模式就是我们可以考虑实现的方式.  原型模式我们也称为克隆模式,即一个某个对象为原型克隆出来一个一模一样的对象,该对象的属性和原型对象一模一样.而且对于原型对象没有任何

原型模式(克隆模式)—浅谈浅克隆与深克隆

克隆是什么?它的产生背景? 当new的对象是多例的时候,new对象将会不断占据内存.特别是消耗内存的大对象,比如数据库连接等.平时运用的不多,只在spring等容器有见过,此处不多赘述,了解即可. 浅克隆与深克隆是什么意思?通过案例逐步探讨. public class Star implements Cloneable,Serializable{ private String name; private Date birthday; public Star(){} public Star(Str

Vmware的克隆模式+LInux系统互相登录

一.VMware虚拟机的克隆 选择虚拟机,右击,选择管理克隆,注意, 选择虚拟机必须是关机状态. 然后点击下一步 继续选择红色箭头 我建议使用链接克隆,省资源. 虚拟机名称,和存放位置,自己选择,然后点击完成.克隆完成. 为什么要学习虚拟机克隆,是为了将来学习,不可能,自己重新安装安装系统,克隆,可以给我省很多时间和精力. 但是,别了,因为是克隆,所以,IP地址和你模板机的IP地址是一样的,所以,要先修改该IP地址.和更改主机名 修改IP地址,前面博客,有方法.修改该主机名命令: hostnam

VMware Horizon 7新功能--即时克隆探索

一:即时克隆介绍 对于即时克隆的介绍可查阅VMware中国的官网微信中以下文章 http://mp.weixin.qq.com/s?__biz=MjM5MDcyNjM4MQ==&mid=402783126&idx=1&sn=79d224a2709e1ae834625e37b53b672d&scene=4#wechat_redirect 以下内容均为摘抄该文章的部分介绍 即时交付功能最早是在2014年的 VMworld 大会上预演的,当时 EUC 部门的 CTO Kit Co

Git克隆部分文件

克隆部分文件html, body {overflow-x: initial !important;}.CodeMirror { height: auto; } .CodeMirror-scroll { overflow-y: hidden; overflow-x: auto; } .CodeMirror-lines { padding: 4px 0px; } .CodeMirror pre { padding: 0px 4px; } .CodeMirror-scrollbar-filler, .

设计模式之六:原型模式(Prototype)

原型模式:使用原型实例来指定创建对象的种类,并通过拷贝这个对象的值来创建新的对象. Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype. UML图: 主要包括 Prototype:定义了一个包含克隆自身的接口 ConcretePrototype:具体的原型类,实现了克隆自身函数的类 Client:通过一个具体的原型

数据克隆的操作类型

Converter Standalone支持基于卷.磁盘和链接的克隆模式.但是无论基于什么模式,Converter Standalone都无法检测位于大小超过2TB的物理磁盘上的任何源卷和文件系统. 基于卷的克隆即将从源计算机复制到目标计算机.基于卷的克隆相对较慢.文件级克隆比块级克隆速度慢.动态磁盘在目标虚拟机上会转为基本卷.只有FAT.FAT32.NTFS.ext2.ext3.ext4和ReiserFS文件系统支持基于卷的文件级克隆.保持源卷的大小或为NTFS源卷指定更大的卷大小时,是基于卷