zoukankan      html  css  js  c++  java
  • 原型模式

    定义:

            通过复制现有的对象实例来创建新的对象实例。

    实现:

    实现Cloneable接口:

            Cloneable接口的作用是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。

    重写Object类中的clone方法:

            Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,原型类需要将clone方法的作用域修改为public类型。

    定义Mail类:

    public class Mail implements Cloneable {    
       private String receiver;    
       private String subject;    
       private String content;    
       private String tail;    
       public Mail(EventTemplate et) {        
           this.tail = et.geteventContent();        
           this.subject = et.geteventSubject();    }    
       @Override    public Mail clone() {        Mail mail = null;        
       try {            mail = (Mail) super.clone();                    } catch (CloneNotSupportedException e) {            
           // TODO Auto-generated catch block            e.printStackTrace();        }        return mail;    }
    //get、set.....
    }

    测试方法:

    public static void main(String[] args) {
       int i = 0;
       int MAX_COUNT = 10;    EventTemplate et = new EventTemplate("邀请函(不变)", "婚嫁生日啥的....(不变部分)");    Mail mail = new Mail(et);    
       while (i < MAX_COUNT) {        Mail cloneMail = mail.clone();        cloneMail.setContent("XXX先生(女士)(变化部分)"
        + mail.getTail());        cloneMail.setReceiver("每个人的邮箱地址...com(变化部分)");        sendMail(cloneMail);        i++;    } }

    优点:

            1,使用原型模型创建一个对象比直接new一个对象更有效率,因为它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。

            2,隐藏了制造新实例的复杂性,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。

    缺点:

            1,由于使用原型模式复制对象时不会调用类的构造方法,所以原型模式无法和单例模式组合使用,因为原型类需要将clone方法的作用域修改为public类型,那么单例模式的条件就无法满足了。

            2,使用原型模式时不能有final对象。

            3,Object类的clone方法只会拷贝对象中的基本数据类型,对于数组,引用对象等只能另行拷贝。

    深拷贝与浅拷贝:

    浅拷贝:

            将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。

    深拷贝:

            将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。

  • 相关阅读:
    原生Js自适应浏览器宽度的瀑布流布局
    Fixed Gear DIY整车配色 JavaScript版制作过程
    DOM结构——两个节点之间可能存在哪些关系以及如何在节点之间任意移动
    盒模型 块级元素与行内元素 浮动元素
    Js 页面元素 简单震动效果
    CSS引入的方式有哪些? link和@import的区别?
    一道Web前端面试题 DIV放大
    js在IE和Firefox下不同之处
    Doctype? 严格模式与混杂模式如何触发这两种模式,区分它们有何意义?
    JavaScript document属性和方法
  • 原文地址:https://www.cnblogs.com/KL2016/p/15772155.html
Copyright © 2011-2022 走看看