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

  • 相关阅读:
    腾讯//最长回文子串
    腾讯//最长回文子串
    马拉车算法
    马拉车算法
    简单实操_Github创建本地仓库及SSH KEY
    Linux5_磁盘 分区 挂载点的理解
    Linux4_手动分区方案
    Linux3_什么是Uboot
    stdin stdout stderr 标准I/O流
    卢克,学着去读源代码
  • 原文地址:https://www.cnblogs.com/hongguang-kim/p/5739849.html
Copyright © 2011-2022 走看看