• Java原型模式


    浅克隆:

    深克隆:

    Java语言提供的clone()方法满足:

    1.对任何的对象x,都有x.clone() != x,即克隆对象与愿对象不是同一个对象。

    2.对任何的对象x,都有x.clone().getClass == x.getClass(),即克隆对象与原对象的类型一样。

    3.如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。

    邮箱复制(浅克隆):

    Attachment:

    public class Attachment {
        public void download(){
            System.out.println("Download:");
        }
    }
    

    Email:

    public class Email implements Cloneable{
        Attachment attachment = null;
    
        public Email clone(){
            Object object = null;
            try{
                object = super.clone();
            }catch (CloneNotSupportedException e){
                System.err.println("Not support cloneable!");
                return null;
            }
            return (Email)object;
        }
    
        public void display(){
            System.out.println("i don't know what i need to display!");
        }
    
        public void setAttachment(Attachment attachment) {
            this.attachment = attachment;
        }
    
        public Attachment getAttachment() {
            return this.attachment;
        }
    }
    

    Client:

    public class Client {
        public static void main(String[] args){
            Email email = new Email();
            Attachment attachment = new Attachment();
            email.setAttachment(attachment);
            Email email_1;
            email_1 = email.clone();
            System.out.println("email 和 email_1 是否相同? " + (email == email_1));
            System.out.println("email 和 email_1 的类型是否相同? " + (email.getClass() == email_1.getClass()));
            System.out.println("email的附件 and email_1的附件是否相同? " + (email.getAttachment() == email_1.getAttachment()));
        }
    }
    

    Result:

    email 和 email_1 是否相同? false
    email 和 email_1 的类型是否相同? true
    email的附件 and email_1的附件是否相同? true

    邮箱复制(深克隆):通过序列化与反序列化进行深度克隆。

     

    Attachment:

    import java.io.Serializable;
    
    public class Attachment implements Serializable{
        public void download(){
            System.out.println("Download");
        }
    }
    

    Email:

    import java.io.*;
    
    public class Email implements Serializable{
        private Attachment attachment;
    
        public void setAttachment(Attachment attachment){
            this.attachment = attachment;
        }
    
        public Attachment getAttachment() {
            return this.attachment;
        }
    
        public void dislay(){
            System.out.println("...");
        }
    
        public Email deepClone() throws IOException,ClassNotFoundException,OptionalDataException{
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(this);
    
            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
    
            return (Email)ois.readObject();
        }
    }
    

    Client:

    public class Client {
        public static void main(String[] args){
            Email email = new Email();
            Email email_1 = null;
            Attachment attachment = new Attachment();
            email.setAttachment(attachment);
            try {
                email_1 = email.deepClone();
            }catch (Exception e){
                System.err.println("deepClone failed!");
            }
            System.out.println("email 和 email_1 是否相同? " + (email == email_1));
            System.out.println("email 和 email_1 的类型是否相同? " + (email.getClass() == email_1.getClass()));
            System.out.println("email的附件 and email_1的附件是否相同? " + (email.getAttachment() == email_1.getAttachment()));
        }
    }
    

    Result:

    email 和 email_1 是否相同? false
    email 和 email_1 的类型是否相同? true
    email的附件 and email_1的附件是否相同? false

     

  • 相关阅读:
    vscode 整理————开篇之力(一)
    重学c#系列——datetime 和 datetimeoffset[二十一]
    重新点亮shell————什么是shell[一]
    重新整理 .net core 实践篇——— 权限中间件源码阅读[四十六]
    为什么构建容器需要Namespace?
    基于Windows Mobile 5.0的掌上天气预报设计
    使用.NE平台调用服务访问非托管 DLL 中的函数
    .NET Framework 3.0 RC1 开发环境构建
    ASP.NET未处理异常的处理
    基于Silverlight的Windows Phone 推箱子程序开发
  • 原文地址:https://www.cnblogs.com/softwarecrash/p/8666810.html
Copyright © 2020-2023  润新知