原型模型

原型模式

(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。

原型模式结构图中包含如下几个角色

●Prototype(抽象原型类):它是声明克隆方法的接口,是所有具体原型类的公共父类,可以是抽象类也可以是接口,甚至还可以是具体实现类。
● ConcretePrototype(具体原型类):它实现在抽象原型类中声明的克隆方法,在克隆方法中返回自己的一个克隆对象。
● Client(客户类):让一个原型对象克隆自身从而创建一个新的对象,在客户类中只需要直接实例化或通过工厂方法等方式创建一个原型对象,再通过调用该对象的克隆方法即可得到多个相同的对象。由于客户类针对抽象原型类Prototype编程,因此用户可以根据需要选择具体原型类,系统具有较好的可扩展性,增加或更换具体原型类都很方便。

下面我就我学习到原型模型总计几个要点

1.通过克隆方法创建的对象是全新的对象,他们在内存中拥有全新的地址。即克隆产生的新的对象在内存中有新的地址。
所以在新的对象中做更改,不会改变原来对象中的数据。
2.Jvav语言提供了clone()方法,在java.lang.Object类中。需要注意的是能够实现克隆的Java类必须实现一个接口Cloneable
3.我们谈一谈浅克隆和深克隆
通俗的理解,浅克隆就是,加入数据是值类型,只复制了数据,加入数据是引用类型,只复制地址。浅克隆,并没有为引用类型的创建新的内存空间。而深克隆,在浅克隆的基础上,为引用类型的变量开辟了新的地址空间。

就此我们写个栗子

在这里插入图片描述

package com.rj.yx;

public class Attachment implements Serializable {
private String name;
public void setName(String name){
    this.name=name;
}
public String getName(){
    return this.name;
}
public void download(){
System.out.println("下载附件,文件名:"+name);
}
}

package com.rj.yx;

public class Client {
    public static void main(String[] args) {
        WeeklyLog log_previous,log_new=null;
        log_previous=new WeeklyLog();
        Attachment attachment =new Attachment();
        log_previous.setAttachment(attachment);
        try{
            log_new=log_previous.deepClone();
        }catch (Exception e){
            System.out.println("克隆失败");
        }
        System.out.println("周报是否相同:"+(log_previous==log_new));
        System.out.println("附件是否相同:"+(log_previous.getAttachment()==log_new.getAttachment()));
    }
}

package com.rj.yx;

import java.io.*;

public class WeeklyLog implements Serializable {
private Attachment attachment;
private  String name;
private String date;
private String content;
public void setAttachment(Attachment attachment){
    this.attachment=attachment;
}
public void setName(String name){
    this.name=name;
}
public void setDate(String date){
    this.date=date;
}
public void setContent(String content){
    this.content=content;
}
public String getName(){
    return name;
}
public String getDate(){
    return date;
}
public String getContent(){
     return content;
}
public Attachment getAttachment(){
    return attachment;
}
public WeeklyLog deepClone() throws IOException,ClassNotFoundException{
    ByteArrayOutputStream bao=new ByteArrayOutputStream();
    ObjectOutputStream oos=new ObjectOutputStream(bao);
    oos.writeObject(this);
    ByteArrayInputStream bis=new ByteArrayInputStream(bao.toByteArray());
    ObjectInputStream ois=new ObjectInputStream(bis);
    return (WeeklyLog)ois.readObject();
}
}

posted on 2019-10-14 17:14  一颗小白杨站在哨所旁  阅读(514)  评论(0编辑  收藏  举报

导航