设计模式之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

posted on 2016-08-05 08:21  金洪光  阅读(287)  评论(0编辑  收藏  举报

导航