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

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

以某个对象为原型,克隆出新的对象。克隆出的新对象不会影响原型对象。

要实现克隆要实现Cloneable接口和clone()方法

注意:clone() 是Object类的本地方法(效率高)

Cloneable只是一个空接口,但是想要克隆,必须实现Cloneable接口

public interface Cloneable {}

 

栗子:

public class People implements Cloneable {    private Date birthday;    private String name;    @Override    protected People clone() throws CloneNotSupportedException {        People p = (People) super.clone();        return p;    }    public People(Date d, String name){        birthday = d;        this.name = name;    }    public Date getBirthday() {        return birthday;    }    public void setBirthday(Date birthday) {        this.birthday = birthday;    }}class Test{    public static void main(String[] args) throws CloneNotSupportedException {        Date d = new Date(1234567897);        People p1 = new People(d, "张三");        People p2 = p1.clone();        System.out.println(p1 == p2); //false 克隆出一个新的对象        System.out.println(p1.getBirthday());        System.out.println(p2.getBirthday());  // 两个值完全相同    }}

这种克隆属于浅克隆:

仅仅把原型对象的值全部克隆给新对象,包括原型对象的一些引用地址(克隆过后,新/原型对象的引用地址指向同一个地址)

 

深克隆:连同属性也一起克隆

@Override    protected People clone() throws CloneNotSupportedException {        People p = (People) super.clone();        p.birthday = (Date) this.birthday.clone();        return p;    }

利用序列化和反序列化 实现深克隆:

class Test{    public static void main(String[] args) throws CloneNotSupportedException, IOException, ClassNotFoundException {        Date d = new Date(1234567897);        People p1 = new People(d, "张三");        //序列化        ByteArrayOutputStream bos = new ByteArrayOutputStream();        ObjectOutputStream oos = new ObjectOutputStream(bos);        oos.writeObject(p1);        byte[] bytes = bos.toByteArray();  //这个字节数组里面有对象的状态和对象属性的值        oos.close();        bos.close();        //反序列化        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);        ObjectInputStream ois = new ObjectInputStream(bis);        People p2 = (People) ois.readObject();        System.out.println(p1.getBirthday());        System.out.println(p2.getBirthday());        //修改原型对象的属性        p1.setBirthday(new Date(987654321));        System.out.println(p1.getBirthday());        System.out.println(p2.getBirthday());    }}

结果:

 

转载于:https://www.cnblogs.com/DDiamondd/p/10969512.html

你可能感兴趣的文章
编译时设置动态链接库路径
查看>>
Java基础代码库:ACM的A+B问题
查看>>
日志分析工具ELK(二)
查看>>
js中eval详解
查看>>
软件设计
查看>>
HDU 5753 Permutation Bo
查看>>
【问题集】VS新建项目——失败——弹出“未将对象引用设置到对象的实例”...
查看>>
blog.yiz96.com
查看>>
centos 创建桌面双击启动程序(更改图标)
查看>>
jq 的grep(); 数组筛选方法
查看>>
[BZOJ] 1059: [ZJOI2007]矩阵游戏
查看>>
HTTP状态码
查看>>
DataGridView key points
查看>>
STL中map与hash_map容器的选择
查看>>
PagedGeometry 笔记02
查看>>
游戏launch界面
查看>>
web前端免费资源集
查看>>
sql 分组后查询出排序字段
查看>>
函数调用机制
查看>>
BZOJ 2001 线段树+LCT (TLE)
查看>>