博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android设计模式系列(10)--SDK源码之原型模式
阅读量:7041 次
发布时间:2019-06-28

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

hot3.png

来自

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 {
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 {
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).减少子类的构造

转载于:https://my.oschina.net/sfshine/blog/470699

你可能感兴趣的文章
编写一个c语言程序 将一串字符串倒叙存放后输出
查看>>
网页设计师和网页前端开发我该选择哪一个
查看>>
我的友情链接
查看>>
推荐自己做的在线流程图、UML、架构图绘制网站
查看>>
用Sublime Text2和MinGW 搭建c编程环境 cc1plus.exe报错
查看>>
八皇后问题--递归与非递归的实现
查看>>
JAVA系列之JVM加载
查看>>
[LeetCode] replace into a Cyclic Sorted List
查看>>
$.each 和$(selector).each()的区别
查看>>
在Xcode中使用Git进行源码版本控制
查看>>
Lync 2013无法登录到lync,提示服务器暂时不可用
查看>>
Linux下PHP网站安全加固配置
查看>>
做自动化测试之前需要了解的
查看>>
Linux终端中文字错位解决
查看>>
再谈swap
查看>>
文本处理三剑客之-sed基础用法
查看>>
宏正ATEN发行全球首款Cat 5双滑轨19寸LCD KVM切换器
查看>>
consui(二)集群配置
查看>>
Windows Cluster 常用命令
查看>>
AndroidStudio生成jar、so、aar以及上传远程库jcenter
查看>>