zoukankan      html  css  js  c++  java
  • 设计模式之Prototype

    设计模式总共有23种模式这仅仅是为了一个目的:解耦+解耦+解耦...(高内聚低耦合满足开闭原则

    介绍:

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

    为什么要用Prototype:

    1.原型引入的根本原因就是在于它可以利用一个原型对象(在这,我指的是实例,而非类),快速地生成一批和原型对象一样的实例。举个例子来说,

    如果你有一个类A,它有十个成员变量,现在你打算生成100个A的实例,而这些实例的变量值大部分相同(比如说七个相同),只有一小部分不一样(比如说三个),

    那么如果没有Prototype,那么你就得每次New一个A的对像,然后赋值,这样,你要重复100次同样的七个变量的赋值工作,显然,这样很麻烦。现在你有了原型,

    那么问题就简单了,你只要生成一个A的实例,再通过clone来生成其它的实例,然后再一一修改其它实例不同的地方。

    2.例如邮件复制功能。

    模式分析:

    所有的java类都继承了java.lang.Object,而Object类提供了一个clone()方法。因此在java中可以直接调用Object类的clone()方法来实现对象的克隆。

    谈如何实现之前我们先了解一个概念。设么是浅复制与深复制。

    浅复制与深复制:

    1.浅复制(浅克隆):

    被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。

    换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

    2.深复制(深克隆):

    被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。

    换言之,深复制把要复制的对象所引用的对象都复制了一遍。

    1.浅复制(浅克隆)UML:

    此例子为当我们负责邮件的时候。不会复制附件(Attachment)

    再次说明所有的java类都继承了java.lang.Object,不要再代码里写extends Object。

    调用clone()方法时需用super.clone();

    2.深复制(深克隆)UML:

    【浅克隆】

    public Object clone() {
            Husband husband = null;
            try{
                husband = (Husband)super.clone();
            }catch(CloneNotSupportedException e){
                e.printStackTrace();
            }finally{
                return husband;
            }
        }

    【深克隆】

    public Object deepClone() throws IOException,ClassNotFoundException {
            //将对象写到流里
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(this);
            //从流里读回来
            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bis);
            return ois.readObject();
        }

    浅复制与深复制具体代码参考:http://www.cnblogs.com/xing901022/p/4051097.html

  • 相关阅读:
    DBA_Oracle Erp重启Database/Application/Concurrent/Apache(案例)
    DBA_Oracle Erp R12安装虚拟机镜像IP修正(案例)
    RMAN_学习实验2_RMAN Duplicate复制数据库过程(案例)
    RMAN_学习实验1_RMAN备份标准过程(案例)
    PLSQL_基础系列12_替换函数用法REPLACE / TRANSLATE / REGEXP_REPLACE
    PLSQL_基础系列11_递归和层次查询CONNECT BY(案例)
    DBA_Oracle Sort排序处理空间耗用(概念)
    DBA_Oracle性能优化的基本方法概述(方法论)
    DBA_Oracle海量数据处理分析(方法论)
    PLSQL_基础系列10_子查询WITH AS(案例)
  • 原文地址:https://www.cnblogs.com/hongguang-kim/p/5739849.html
Copyright © 2011-2022 走看看