1、定义:

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

2、目的:



从一个对象创建另外一个可定制的对象,而不须要知道不论什么创建细节。

3、作用:

3.1、简化对象的创建。

3.2 、对于处理大对象。性能上比new 高出非常多。

4、分类:

4.1浅拷贝:拷贝对象中的主要的数据类型。对于数组、容器对象、引用对象等都不会拷贝。

4.2深拷贝:将全部类型进行拷贝。

5、注意:

5.1对象实现Cloneable接口,必须将Object clone()
方法改为public;

5.2对于基本数据类型,其封装类型。String不须要进行处理。

他们进行的均是深拷贝。

6、简单的demo:

浅拷贝:

package com.example.demo.Prototype;
/**
* 浅拷贝
* @author qubian
* @data 2015年6月4日
* @email naibbian@163.com
*
*/
public class Prototype implements Cloneable { private int num;
private String name; public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public Object clone() {
Prototype prototype = null;
try {
prototype = (Prototype) super.clone(); } catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return prototype;
} }

深拷贝:

package com.example.demo.Prototype;

import java.util.ArrayList;
import java.util.Vector;
/**
* 深拷贝
* @author qubian
* @data 2015年6月4日
* @email naibbian@163.com
*
*/
public class DeepPrototype implements Cloneable{ private String name;
private ArrayList<String> arrayList; private DeepObject deepObject; public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ArrayList<String> getArrayList() {
return arrayList;
}
public void setArrayList(ArrayList<String> arrayList) {
this.arrayList = arrayList;
}
public DeepObject getDeepObject() {
return deepObject;
}
public void setDeepObject(DeepObject deepObject) {
this.deepObject = deepObject;
}
/**
* clone 方法
*/
@SuppressWarnings("unchecked")
@Override
public Object clone() {
DeepPrototype prototype = null;
try {
prototype = (DeepPrototype) super.clone();
prototype.arrayList=(ArrayList<String>) this.arrayList.clone();
prototype.deepObject=(DeepObject) this.deepObject.clone(); } catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return prototype;
} class DeepObject implements Cloneable
{
String name;
protected Object clone() {
DeepObject deep=null;
try {
deep= (DeepObject) super.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return deep;
};
}
}

7、原型模式在Android中的运用:

最明显的样例就是Intent,可是好像还未知其用处。

可是细看,竟然还是new 的对象。

public class Intent implements Parcelable, Cloneable {
/**
* Copy constructor.
*/
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 ArraySet<String>(o.mCategories);
}
if (o.mExtras != null) {
this.mExtras = new Bundle(o.mExtras);
}
if (o.mSourceBounds != null) {
this.mSourceBounds = new Rect(o.mSourceBounds);
}
if (o.mSelector != null) {
this.mSelector = new Intent(o.mSelector);
}
if (o.mClipData != null) {
this.mClipData = new ClipData(o.mClipData);
}
} @Override
public Object clone() {
return new Intent(this);
} }

Android设计模式(七)--原型模式的更多相关文章

  1. Android设计模式系列--原型模式

    CV一族,应该很容易理解原型模式的原理,复制,粘贴完后看具体情况是否修改,其实这就是原型模式.从java的角度看,一般使用原型模式有个明显的特点,就是实现cloneable的clone()方法.原型模 ...

  2. 设计模式_11_原型模式(prototype)深拷贝、浅拷贝

    设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...

  3. C#设计模式(6)——原型模式(Prototype Pattern)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  4. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...

  5. C#设计模式之六原型模式(Prototype)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  6. Android 设计模式之MVC模式

    说到Android设计模式的MVC模式,估计很多人都是比较熟悉了,这里深入了解一下MVC到底是怎么回事,以ListView为例子讲解. 一.深入理解MVC概念 MVC即Model-View-Contr ...

  7. C#设计模式之五原型模式(Prototype Pattern)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  8. C#设计模式(6)——原型模式(Prototype Pattern)(转)

    一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...

  9. C#设计模式(6)——原型模式(Prototype Pattern) C# 深浅复制 MemberwiseClone

    C#设计模式(6)——原型模式(Prototype Pattern)   一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创 ...

  10. JAVA 设计模式之原型模式

    目录 JAVA 设计模式之原型模式 简介 Java实现 1.浅拷贝 2.深拷贝 优缺点说明 1.优点 2.缺点 JAVA 设计模式之原型模式 简介 原型模式是六种创建型设计模式之一,主要应用于创建相同 ...

随机推荐

  1. Android configChanges使用方法

    1.    在manifest文件里使用activity的默认属性.横屏竖屏时,惠重复调用onDestory和onCreate  造成不必要的开销.Android默认如此应该是为了适配不同的xml布局 ...

  2. eclipse软件快捷键的使用

    [Ct rl+T] 搜索当前接口的实现类 1. [ALT +/]    此快捷键为用户编辑的好帮手,能为用户提供内容的辅助,不要为记不全方法和属性名称犯愁,当记不全类.方法和属性的名字时,多体验一下[ ...

  3. MySQ学习笔记之十 NULL值处理

    这是MySQL一大特殊之处. 概念上.NULL意味着"没有值"或"未知值",且它被看作有点与众不同的值. 为了測试NULL.你不能使用算术比較运算符比如=.&l ...

  4. hdoj--1408--盐水的故事(技巧)

    盐水的故事 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  5. 机器学习规则:ML工程最佳实践----rules_of_ml section 2【翻译】

    作者:黄永刚 ML Phase II: 特征工程 第一阶段介绍了机器学习的一个周期,为学习系统获取训练数据,通过有趣的引导设计指标,创建一个服务框架.在有了一个完整系统之后,就进入了第一阶段. 第二阶 ...

  6. Ionic CLI升级到3版本后2版本工程运行出错.md

    1. 问题描述: 最近将Ionic的CLI升级到了最新的版本3.2,升级后在原来Ionic2版本的CLI中创建的工程,通过ionic serve运行报错,错误类似如下: C:\Users\Admin\ ...

  7. Host status showing red icon in chronograph, Chronograf主机列表页显示主机状态为红色标志

    刚开始全部装好的时候主机显示的状态是绿色的,过了些日子我再打开看的时候就变成红色的了,点击主机进去查看的时候没有了图表数据,大概是这样子的, 在influxdb数据库主机上执行命令curl " ...

  8. appium使用教程(三)-------------用例编写

    1. 驱动 import os, time, unittest from appium import webdriver PATH = lambda p:os.path.abspath(os.path ...

  9. NodeJS学习笔记 (26)命令行设计-repl

    https://github.com/chyingp/nodejs-learning-guide

  10. ES6学习笔记(十三)Iterator遍历器和for...of循环

    1.概念 遍历器(Iterator)就是这样一种机制.它是一种接口,为各种不同的数据结构提供统一的访问机制.任何数据结构只要部署 Iterator 接口,就可以完成遍历操作(即依次处理该数据结构的所有 ...