原型模式

Posted zhenhong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原型模式相关的知识,希望对你有一定的参考价值。

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

以上是关于原型模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之原型模式(Prototype)详解及代码示例

设计模式课程 设计模式精讲 9-2 原型模式coding

设计模式--原型模式

5.原型模式

设计模式原型模式

csharp 设计模式 - 原型 - 结构代码