文档章节

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

SuShine
 SuShine
发布于 2015/06/25 15:27
字数 830
阅读 2
收藏 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
粉丝 124
博文 518
码字总数 150044
作品 0
朝阳
后端工程师
私信 提问
Android 网络编程 目录

Android 网络编程 目录 Android 网络编程1 Http协议 Android 网络编程2 Okhttp缓存机制 Android 网络编程3 Java NIO to be continued... Android 架构师之路 目录 Android 架构师之路1 UML图...

香沙小熊
06/21
0
0
Android--面试中遇到的问题总结(三)

《Android 开发工程师面试指南 LearningNotes 》,作者是陶程,由梁观全贡献部分。大家可以去知乎关注这两位用心的少年。这份指南包含了大部分Android开发的基础、进阶知识,不仅可以帮助准备...

sealin
2017/02/22
0
0
android与模式:单例模式

这是我们最常见的一类模式,对这一类模式有一个通用的特点就是: 封装创建的方式和过程。 这里所谓封装就是隐藏的意思,对对象的创建方法和过程不可见,或者是虚拟的过程。 隐藏创建方式,就...

今幕明
2014/03/12
0
0
Android也架构之二:单例模式访问网络

oschina中没有代码插入,看带有代码的文章挺费劲的,如果你和我一样 请移步:http://blog.csdn.net/michaelyy/article/details/7883621 或者我的个人网站 http://www.devchina.com 首先我们来...

理工男海哥
2012/08/19
0
1
结合 Android 看看单例模式怎么写

定义及使用场景 定义 单例模式,就是在整个系统中某一个类的实例只有一个,并且自行实例化向整个系统提供;简单来说,就是某个类被实例化的方式是唯一的;同时他它必须向系统自动提供这个实例...

IAM四十二
10/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

AMD重回服务器:Oracle甲骨文宣布将使用AMD EPYC处理器

导读 AMD的EPYC的推出,让AMD重新有了在服务器级,数据中心级等大型政企领域的竞争机会。如今,很多云服务商开始使用EPYC处理器,Oracle也在近期宣布了将使用EPYC处理器的消息。 甲骨文也公布...

问题终结者
25分钟前
0
0
Maven 依赖范围(Dependency Scope)

Dependency Scope Dependency scope is used to limit the transitivity of a dependency, and also to affect the classpath used for various build tasks. 依赖范围用于限制依赖项的传递性......

晨猫
41分钟前
1
0
细述hbase协处理器

1.起因(Why HBase Coprocessor) HBase作为列族数据库最经常被人诟病的特性包括:无法轻易建立“二级索引”,难以执行求和、计数、排序等操作。比如,在旧版本的(<0.92)Hbase中,统计数据表的...

微笑向暖wx
55分钟前
1
0
【实践】如何获得Rinkeby网络的测试以太币

当把智能合约部署到Rinkeby Test Network时,需要获得测试以太币。其网络获取测试以太币的方法同Ropsten Test Network有些不同,本文详细讲解一下。 1 访问网站 访问rinkeby网络(https://w...

HiBlock
今天
1
0
Logback中如何自定义灵活的日志过滤规则

当我们需要对日志的打印要做一些范围的控制的时候,通常都是通过为各个Appender设置不同的Filter配置来实现。在Logback中自带了两个过滤器实现:ch.qos.logback.classic.filter.LevelFilter...

程序猿DD
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部