三分钟理解“原型模式”——设计模式轻松掌握

原型模式的官方定义:

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

大白话:

现在有一个类,它要产生大量的对象,而且这些对象中的属性值大部分都相同;如果我们要获取这样一个对象的时候每次都通过new,然后再set每一个属性值,那么这样就太麻烦了。这种情况下使用原型模式非常便捷:

我们让这个类去实现ICloneable接口,并且实现该接口的clone()函数,在clone函数中让当前对象进行一次浅拷贝/深拷贝,总之就是克隆一个当前对象来,这样我们就无需new完了对象后再逐个set属性了。

原型模式的类图:

如果一个类要使得调用者能够克隆,那在定义这个类的时候就需要让它实现ICloneable接口,并实现clone函数,在函数中实现当前对象的浅拷贝或深拷贝。

客户端拿到这个类后,如果需要克隆对象,调用这个类的clone函数即可。

深拷贝和浅拷贝:

浅拷贝:将对象中基本数据类型的值复制到新的对象中去,若对象中有引用类型的属性,则将引用复制给新对象,此时,新旧对象中引用类型的指针都指向同一个对象。

如上图所示:新对象中的phone是基本数据类型,它的值是旧对象中直接复制过来的;而新对象中的Person是引用类型,它和旧对象中的Perosn都指向同一个Person对象。

深拷贝:深拷贝和浅拷贝对于基本数据类型都是一样复制,不同之处在于:浅拷贝之后新旧对象中的引用类型的变量都指向同一个对象,而深拷贝当遇到引用类型的对象时,再new一个对象,新对象中的引用类型变量指向新创建的对象,如下图所示:

使用深拷贝实现原型模式:

如上图所示,原型类中有引用类型的成员变量Person,并且Person类中有引用类型的成员变量Work,要实现深拷贝,要使得原型类、Person类、Work类中的clone函数都要实现深拷贝的功能,实现深拷贝的clone函数如下:

public Object clone(){

//将当前对象进行一次浅拷贝

原型 p = this.clone();

//将当前对象中引用类型的变量进行一次深拷贝。由于Person类也实现了ICloneable接口,并且clone函数也进行了一样的操作,调用Work类的clone函数,由于Work类中全都是基本数据类型,所以Work类不需要实现ICloneable接口,对Work类的克隆仅需要Object提供的clone()函数进行浅拷贝即可。

p.setPerson(this.person.clone());

return p;

}

Java中的clone函数:

Java中的Object类中就有clone()函数,并且这个函数是对对象进行浅拷贝。当我们需要对一个对象进行深拷贝的时候,就必须要让这个类实现Cloneable接口,并且重写clone()函数。

Java中的深拷贝和浅拷贝请移步至:http://blog.csdn.net/shootyou/article/details/3945221

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术之路

详解go语言的array和slice 【一】

  本篇会详细讲解go语言中的array和slice,和平时开发中使用时需要注意的地方,以免入坑。   Go语言中array是一组定长的同类型数据集合,并且是连...

2247
来自专栏浪淘沙

实训day05--静态,继承

2018.06.08 1.private关键字 权限修饰符 修饰类,方法,属性,构造函数 最常用的形式: 把成员变量用pri...

925
来自专栏陈树义

《JavaScript程序设计》第2课:JS类型系统

JS类型系统可以分为标准类型和对象类型,进一步标准类型又可以分为原始类型和引用类型,而对象类型又可以分为内置对象类型、普通对象类型、自定义对象类型。 ? 1. ...

3087
来自专栏大闲人柴毛毛

稳扎稳打JavaScript(二)——图解对象内存模型

1. 什么是JS对象? 在JS中,对象是一组无序属性的集合。其中,属性可以是基本数据类型、引用类型、函数。如下面这个对象的例子: var chai={ ...

3906
来自专栏IT可乐

Java关键字(五)——this

1042
来自专栏水击三千

JavaScript函数(二)

在前面我们已经对函数作了简单的介绍,比如函数的定义、函数的声明、函数的调用和函数的传参等。本节将进一步介绍函数的应用,深度理解函数的各种使用。 函数是一个对象,...

2697
来自专栏算法与数据结构

CC150--确定字符互异

请实现一个算法,确定一个字符串的所有字符是否全都不同。这里我们要求不允许使用额外的存储结构。

672
来自专栏全沾开发(huā)

学习zepto.js(对象方法)[6]

学习zepto.js(对象方法)[6] first: 获取当前对象集合中的第一个dom元素。 $("div").first();// ...

3258
来自专栏calmound

Javascript字符串

## 定义 ``` var str = new String("abcdefg"); var str = "abcdefg"; ``` ## 常用方法 ###...

2826
来自专栏区块链入门

【易错概念】以太坊Solidity函数的external/internal,public/private,view/pure/payable区别

函数类型是一种表示函数的类型。可以将一个函数赋值给另一个函数类型的变量,也可以将一个函数作为参数进行传递,还能在函数调用中返回函数类型变量。 函数类型有两类:-...

1124

扫码关注云+社区