服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

原始模型模式

        原始模型模式,我认为也可以称为克隆模式,就是由一个完整的产品对象复制出另一个对象的模式。它也是对象的创建模式,但是只与原始对象有关,不需要工厂类。

        原始模型模式最成功的应用之一就是object类的clone方法,可能由于这种方法的存在,很多人没有意识到原始模型模式是一种特定的创建模式。但是,它的确是一种产生对象的模式,而且clone方法所实现的只是原始模型模式的一种情况。
        原始模型模式的对象创建方式有两种,可以分别称为浅复制和深复制:浅复制就是从原对象复制出新的对象时,并不复制它的成员对象,即它的成员对象句柄所指向的还是原对象中的成员对象;深复制就是在新对象中,成员对象也是新的。
原始模型模式(图一)package prototype;
原始模型模式(图一)
原始模型模式(图二)原始模型模式(图三)public interface prototype ...{
原始模型模式(图四)
原始模型模式(图四)    public void printpart();
原始模型模式(图四)    
原始模型模式(图四)    object flatclone();
原始模型模式(图四)    
原始模型模式(图四)    object deepclone() throws exception;
原始模型模式(图四)    
原始模型模式(图五)}
原始模型模式(图一)
原始模型模式(图一)
原始模型模式(图一)package prototype;
原始模型模式(图一)
原始模型模式(图一)import java.io.*;
原始模型模式(图一)
原始模型模式(图二)原始模型模式(图三)public class concreteprototype implements prototype , serializable...{
原始模型模式(图四)
原始模型模式(图四)    private part part;
原始模型模式(图四)    
原始模型模式(图六)原始模型模式(图七)    public concreteprototype() ...{
原始模型模式(图四)        part = new part();
原始模型模式(图八)    }
原始模型模式(图四)    
原始模型模式(图六)原始模型模式(图七)    public void printpart() ...{
原始模型模式(图四)        system.out.println(part);
原始模型模式(图八)    }
原始模型模式(图四)    
原始模型模式(图四)
原始模型模式(图六)原始模型模式(图七)    public object flatclone() ...{
原始模型模式(图四)        concreteprototype cp = new concreteprototype();
原始模型模式(图四)        cp.part = this.part;
原始模型模式(图四)        return cp;
原始模型模式(图八)    }
原始模型模式(图四)
原始模型模式(图四)    
原始模型模式(图六)原始模型模式(图七)    public object deepclone() throws exception ...{
原始模型模式(图四)        bytearrayoutputstream bo = new bytearrayoutputstream();
原始模型模式(图四)        objectoutputstream oo = new objectoutputstream(bo);
原始模型模式(图四)        oo.writeobject(this);
原始模型模式(图四)        bytearrayinputstream bi = new bytearrayinputstream(bo.tobytearray());
原始模型模式(图四)        objectinputstream oi = new objectinputstream(bi);
原始模型模式(图四)        return (oi.readobject());
原始模型模式(图八)    }
原始模型模式(图四)
原始模型模式(图六)原始模型模式(图七)    class part implements serializable ...{
原始模型模式(图四)        
原始模型模式(图八)    }
原始模型模式(图四)    
原始模型模式(图五)}
原始模型模式(图一)
原始模型模式(图一)
原始模型模式(图一)package prototype;
原始模型模式(图一)
原始模型模式(图二)原始模型模式(图三)public class client ...{
原始模型模式(图四)    
原始模型模式(图六)原始模型模式(图七)    public static void main(string[] args) throws exception ...{
原始模型模式(图四)        concreteprototype originate, cloned, deepcloned;
原始模型模式(图四)        originate = new concreteprototype();
原始模型模式(图四)
原始模型模式(图四)        thread.sleep(2000);
原始模型模式(图四)
原始模型模式(图四)        cloned = (concreteprototype)originate.flatclone();
原始模型模式(图四)        deepcloned = (concreteprototype)originate.deepclone();
原始模型模式(图四)        system.out.println(originate);
原始模型模式(图四)        system.out.println(cloned);
原始模型模式(图四)        system.out.println(deepcloned);
原始模型模式(图四)        originate.printpart();
原始模型模式(图四)        cloned.printpart();
原始模型模式(图四)        deepcloned.printpart();
原始模型模式(图八)    }
原始模型模式(图四)
原始模型模式(图五)}
原始模型模式(图一)
 

    下面是这段代码的打印:

prototype.concreteprototype@1034bb5
prototype.concreteprototype@19efb05
prototype.concreteprototype@723d7c
prototype.concreteprototype$part@b162d5
prototype.concreteprototype$part@b162d5
prototype.concreteprototype$part@22c95b

        可以看出,打印的前三行各不相同,这说明通过浅复制和深复制,所得到的对象都是与原对象不同的;打印的后三行中有两行相同,这说明,在浅复制时,成员对象的实体没有被复制,只是复制了其句柄,而深复制时,成员对象的实体也被复制了。

扫描关注微信公众号