zoukankan      html  css  js  c++  java
  • 原型模式

    一、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=黄色]

  • 相关阅读:
    day1 instance,round,divmod,imput, 字符串
    Django中如何将javascript中的变量传给位于javascript内的{% url %}中的参数?
    demo_33 评论发布弹窗实现
    demo_32 富文本渲染
    demo_31 详情页面数据初始化
    demo_30 内容预加载
    demo_29 详情页页面展示
    demo_28 使用自定义事件同步数据
    demo_27 保存标签页数据
    demo_26 编辑标签页
  • 原文地址:https://www.cnblogs.com/honger/p/5962093.html
Copyright © 2011-2022 走看看