原型模型

原型模式

(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();
}
}

点击链接加入群聊【程序员技术交流群】:添加链接描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值