文档章节

Android设计模式系列(10)--SDK源码之原型模式

SuShine
 SuShine
发布于 2015/06/25 15:27
字数 830
阅读 17
收藏 0

阿里云携手百名商业领袖、技术大咖,带您一探行进中的数字新基建!>>>

来自http://www.cnblogs.com/qianxudetianxia/archive/2012/03/02/2020355.html


CV一族,应该很容易理解原型模式的原理,复制,粘贴完后看具体情况是否修改,其实这就是原型模式。
从java的角度看,一般使用原型模式有个明显的特点,就是实现cloneable的clone()方法。
原型模式,能快速克隆出一个与已经存在对象类似的另外一个我们想要的新对象。

1.意图
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
热门词汇:克隆 深拷贝 浅拷贝

2.结构图和代码
它的结构图非常简单,我们以Intent为例子:


Intent的clone方法非常简单:

?
1
2
3
4
@Override
public  Object clone() {
     return  new  Intent( this );
}

返回一个新的Intent对象。
克隆操作分深拷贝和浅拷贝,浅拷贝说白了就是把原对象所有的值和引用直接赋给新对象。深拷贝则不仅把原对象的值赋给新对象,而且会把原对象的引用对象也重新创建一遍再赋给新对象。
我们具体分析一下Intent是浅拷贝还是深拷贝吧:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public  Intent(Intent o) {
     this .mAction = o.mAction;
     this .mData = o.mData;
     this .mType = o.mType;
     this .mPackage = o.mPackage;
     this .mComponent = o.mComponent;
     this .mFlags = o.mFlags;
     //下面几个是引用对象被重新创建了,是深拷贝
     if  (o.mCategories != null ) {
         this .mCategories = new  HashSet<String>(o.mCategories);
     }
     if  (o.mExtras != null ) {
         this .mExtras = new  Bundle(o.mExtras);
     }
     if  (o.mSourceBounds != null ) {
         this .mSourceBounds = new  Rect(o.mSourceBounds);
     }
}

这里我们为什么Intent要重写Object的clone方法,就与深拷贝有关。
其实我们查看Object的clone()方法源码和注释,默认的super.clone()用的就是浅拷贝:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
  * Creates and returns a copy of this {@code Object}. The default
  * implementation returns a so-called "shallow" copy: It creates a new
  * instance of the same class and then copies the field values (including
  * object references) from this instance to the new instance. A "deep" copy,
  * in contrast, would also recursively clone nested objects. A subclass that
  * needs to implement this kind of cloning should call {@code super.clone()}
  * to create the new instance and then create deep copies of the nested,
  * mutable objects.
  */
protected  Object clone() throws  CloneNotSupportedException {
     if  (!( this  instanceof  Cloneable)) {
         throw  new  CloneNotSupportedException( "Class doesn't implement Cloneable" );
     }
 
     return  internalClone((Cloneable) this );
}

这种形式属于简单形式的原型模式,如果需要创建的原型数目不固定,可以创建一个原型管理器,在复制原型对象之前,客户端先在原型管理器中查看
是否存在满足条件的原型对象,如果有,则直接使用,如果没有,克隆一个,这种称作登记形式的原型模式。
适用原型模式可以对客户隐藏产品的具体类,因此减少了客户知道的名字的数目,此外是客户无需改变
原型模式的缺陷是每个原型的子类都必须实现Cloneable接口,这个实现起来有时候比较困难。

3. 效果
(1).创建型模式
(2).运行时刻增加和删除产品
(3).改变只以指定新对象(ctrl+v,然后修改)
(4).改变结构以指定新对象。(类似2,实现不同而已)
(5).减少子类的构造


本文转载自:http://blog.csdn.net/sfshine/article/details/8209830

SuShine
粉丝 132
博文 630
码字总数 160326
作品 0
朝阳
后端工程师
私信 提问
加载中

评论(0)

Android开发中常见的设计模式 MD

Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com 目录 目录 ---------- 创建型模式 - 6个 ---------- - 单...

osc_3rll7emc
2019/04/06
6
0
【设计模式与Android】建造者模式——建军大业

什么是建造者模式 所谓建造者模式,就是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的设计模式。建造者模式在构建过程中隐藏了复杂的实现细节,可以大大降低...

东风玖哥
2017/10/15
0
0
Android常见设计模式十:Build模式

对于开发人员来说,设计模式有时候就是一道坎,但是设计模式又非常有用,过了这道坎,它可以让你水平提高一个档次。而在android开发中,必要的了解一些设计模式又是必须的,因为设计模式在A...

shzwork
2019/09/26
38
0
【设计模式与Android】策略模式——锦囊里的上策中策下策

什么是策略模式 所谓策略模式,就是定义一系列的算法,并将每一个算法封装起来,而且使它们可以相互替换的设计模式。策略模式让算法独立于使用它的用户而独立变化。一般用于同类问题的不同处...

东风玖哥
2017/10/16
0
0
【设计模式与Android】原型模式——复制中心走出来的克隆人

什么是原型模式 所谓原型模式,就是用原型实例来指定创建对象的种类,并通过复制这些原型创建新的对象的设计模式。原型模式一般用于创建复杂的或者构建耗时的实例,或者用于只读对象的修改。...

东风玖哥
2017/10/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

假使年轻的时候鞭策自己

我自己就是浪费了很多时间的一个人。我不打麻将,我不经常的听戏看电影,几年中难得一次,我不长时间看电视,通常只看半个小时,我也不串门子闲聊天。有人问我:“那么你大部分时间都做了些什...

瑾123
39分钟前
13
0
文章错别字检测软件有哪些?蚁小二真的好用

文章错别字检测软件有哪些?蚁小二真的好用,据市场研究调查发现,我们对文章当中错别字的检测和修改这样的需求是一直存在的,只是市场上面还没有一个比较好用的软件来辅助我们做错别字检测。...

一键分发工具-蚁小二
42分钟前
24
0
文章原创度检测工具有哪些?这些工具你可以拥有

文章原创度检测工具有哪些?这些工具你可以拥有,随着自媒体行业的发展,现在很多自媒体人都进入到互联网行业,但是随着大家的深入发展,会发现有时候自己的文章在自媒体平台上推荐很少,其实...

易撰
42分钟前
15
0
FTP工具软件,FTP工具软件下载!

IIS7服务器管理工具是一款FTP的客户端软件,能够批量执行FTP的命令!可以提高FTP的传输效率! 同时,它也可以作为VNC的客户端,能够进行相关的VNC操作;同时,它还可以批量连接Windows和Lin...

Raymond13
43分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部