博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
原型模式
阅读量:4334 次
发布时间:2019-06-07

本文共 4621 字,大约阅读时间需要 15 分钟。

一、java中的构建模型直接支持原始模型。所有的javaBean都继承Object类,Object类有一个clone方法,用于克隆对象,而克隆对象又分为浅复制和深复制。

二、大致结构

1、原始接口类

2、具体原始类

三、代码

1、原始接口类

package com.prototype;public interface Prototype extends Cloneable {        Prototype deepClone();        Prototype shallowClone();    }

2、具体原始类

package com.prototype;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.Serializable;public class Person implements Prototype, Serializable {        /**     *      */    private static final long serialVersionUID = -5730267042366141834L;    private String name;        private int age;        private Dog dog;        public Person(String name, int age, Dog dog) {        this.name = name;        this.age = age;        this.dog = dog;            }        public Dog getDog() {        return dog;    }    public void setDog(Dog dog) {        this.dog = dog;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }        /**     * 深复制,会将dog引用的对象也复制一份     */        @Override    public Prototype deepClone() {        //创建数组输出流,将对象存到内存中        ByteArrayOutputStream byteArrayOutputStream = null;        ObjectOutputStream objectOutputStream = null;        ByteArrayInputStream byteArrayInputStream = null;        ObjectInputStream objectInputStream = null;        Person person = null;        try {            byteArrayOutputStream = new ByteArrayOutputStream();            objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);            //将对象存入内存,并复制一份留在堆中            objectOutputStream.writeObject(this);            byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());            objectInputStream = new ObjectInputStream(byteArrayInputStream);            //读取内存,将对象取出            person = (Person) objectInputStream.readObject();        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if(byteArrayOutputStream != null) {                                        byteArrayOutputStream.close();                }                                if(objectOutputStream != null) {                                        objectOutputStream.close();                }                                if(byteArrayInputStream != null) {                                        byteArrayInputStream.close();                }                if(objectInputStream != null) {                                        objectInputStream.close();                }            } catch (Exception e) {                e.printStackTrace();            }                    }        return person;    }    /**     * 浅复制,复制dog对象的引用     */    @Override    public Prototype shallowClone() {        Prototype obj = null;        try {            obj = (Person)super.clone();        } catch (CloneNotSupportedException e) {            e.printStackTrace();        }                return obj;            }                }

3、Person的附属对象

package com.prototype;import java.io.Serializable;public class Dog implements Serializable {    /**     *      */    private static final long serialVersionUID = 5518998591955476396L;    private String name;        private String color;        public Dog(String name, String color) {        this.name = name;                this.color = color;            }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getColor() {        return color;    }    public void setColor(String color) {        this.color = color;    }    @Override    public String toString() {        return "Dog [name=" + name + ", color=" + color + "]";    }        }

4、测试类

package com.prototype;public class Test {        public static void main(String[] args) {                Person person1 = new Person("youth", 22, new Dog("阿黄", "黄色"));                Person person2 = (Person) person1.shallowClone();        //浅复制的dog对象仍然是原来的对象        System.out.println(person1.getDog() == person2.getDog());                Person person3 = (Person) person1.deepClone();        //深复制的dog对象是不是同一个对象,两者为克隆关系        System.out.println(person1.getDog() == person3.getDog());        System.out.println("本尊:" + person1.getDog());        System.out.println("克隆:" + person3.getDog());                    }}

5、结果

true

false
本尊:Dog [name=阿黄, color=黄色]
克隆:Dog [name=阿黄, color=黄色]

转载于:https://www.cnblogs.com/honger/p/5962093.html

你可能感兴趣的文章
nginx+tomcat+redis实现会话共享
查看>>
C++简单文件操作
查看>>
七牛云的存储对象的地区改变之后
查看>>
修改AspNetSqlMembershipProvider的密码规则
查看>>
TED:如何掌控你的自由时间以及让自己变得更好,这样就能看到爱情应有的样子...
查看>>
JQuery系列(8) - JQuery插件开发
查看>>
想当然是编程最大的坑,记更新删除过期cookie无效有感
查看>>
classmethod和staticmethod
查看>>
Thymeleaf 模板 springboot集成使用
查看>>
配置IIS Silverlight运行环境
查看>>
Android学习路线
查看>>
使用maven一步一步构建spring mvc项目
查看>>
python运维开发之第十一天(RabbitMQ,redis)
查看>>
cmd 常用操作
查看>>
Mac下Jekyll安装
查看>>
centOS 7 yum安装MySQL5.6
查看>>
模型多语言
查看>>
JavaScript对象
查看>>
tab 页形式展现多张报表
查看>>
SharePoint 2010/SharePoint 2013 Custom Action: 基于Site Collection 滚动文字的通知.
查看>>