原文:http://www.runoob.com/design-pattern/
少许个人理解,如有错误请指出
菜鸟教程讲的比较难懂,有篇简洁易懂的博客:
http://blog.csdn.net/jason0539/article/details/23158081

原型模式(Prototype Pattern)
是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。(速度快,因为很多地方是复制的引用)
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

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

主要解决:
在运行期建立和删除原型。

何时使用:
1、当一个系统应该独立于它的产品创建,构成和表示时。
2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。
3、为了避免创建一个与产品类层次平行的工厂类层次时。
4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。

如何解决:
利用已有的一个原型对象,快速地生成和原型对象一样的实例。

关键代码:
1、实现克隆操作,在 JAVA 继承 Cloneable,重写 clone(),在 .NET 中可以使用 Object 类的 MemberwiseClone() 方法来实现对象的浅拷贝或通过序列化的方式来实现深拷贝(浅拷贝文末会提及)。
2、原型模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些”易变类”拥有稳定的接口。

现实类比:
1、细胞分裂。
2、JAVA 中的 Object clone() 方法。

优点:
1、性能提高。(加速对象创建)
2、逃避构造函数的约束。

缺点:
1、配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。
2、必须实现 Cloneable 接口。
3、逃避构造函数的约束。

使用场景:
1、资源优化场景。
2、类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等。
3、性能和安全要求的场景。
4、通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。
5、一个对象多个修改者的场景。
6、一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。
7、在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone 的方法创建一个对象,然后由工厂方法提供给调用者。原型模式已经与 Java 融为浑然一体,大家可以随手拿来使用。

注意事项:
与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流。(这个看不懂去看文末的链接吧)

————–以下是那篇比较简洁易懂的博客内容(上面说的比较繁琐,这个是个简洁版)
原型模式:主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件:

  • 实现Cloneable接口。

在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常。

  • 重写Object类中的clone方法。

Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的一个拷贝,但是其作用域protected类型的,一般的类无法调用,因此,Prototype类需要将clone方法的作用域修改为public类型。

总结:
原型模式是一种比较简单的模式,也非常容易理解,实现一个接口,重写一个方法即完成了原型模式。
在实际应用中,原型模式很少单独出现。经常与其他模式混用,他的原型类Prototype也常用抽象类来替代。

实现:
Prototype.Java

class Prototype implements Cloneable {    public Prototype clone(){    Prototype prototype = null;    try{    prototype = (Prototype)super.clone();    }catch(CloneNotSupportedException e){    e.printStackTrace();    }    return prototype;     }
}    

ConcretePrototype.java

class ConcretePrototype extends Prototype{    public void show(){    System.out.println("原型模式实现类");    }
}    

Client.java

public class Client {    public static void main(String[] args){    ConcretePrototype cp = new ConcretePrototype();    for(int i=0; i< 10; i++){    ConcretePrototype clonecp = (ConcretePrototype)cp.clone();    clonecp.show();    }    }
}   

类图:

使用原型模式创建对象比直接new一个对象在性能上要好的多
因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。
使用原型模式的另一个好处是简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。
因为以上优点,所以在需要重复地创建相似对象时可以考虑使用原型模式。比如需要在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。

使用原型模式复制对象不会调用类的构造方法。
因为对象的复制是通过调用Object类的clone方法来完成的,它直接在内存中复制数据,因此不会调用到类的构造方法。不但构造方法中的代码不会执行,甚至连访问权限都对原型模式无效。单例模式中,只要将构造方法的访问权限设置为private型,就可以实现单例。但是clone方法直接无视构造方法的权限,所以,单例模式与原型模式是冲突的,在使用时要特别注意。
深拷贝与浅拷贝。Object类的clone方法只会拷贝对象中的基本的数据类型(8种基本数据类型byte,char,short,int,long,float,double,boolean),对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须将原型模式中的数组、容器对象、引用对象等另行拷贝。例如:

public class Prototype implements Cloneable {    private ArrayList list = new ArrayList();    public Prototype clone(){    Prototype prototype = null;    try{    prototype = (Prototype)super.clone();    prototype.list = (ArrayList) this.list.clone();    }catch(CloneNotSupportedException e){    e.printStackTrace();    }    return prototype;     }
}    

由于ArrayList不是基本类型,所以成员变量list,不会被拷贝,需要我们自己实现深拷贝,幸运的是Java提供的大部分的容器类都实现了Cloneable接口。所以实现深拷贝并不是特别困难。
————end 网络原文

个人稍稍总结:
原型模式的目的:使对象的创建简单化(部分浅拷贝,即部分复制引用)
关于浅拷贝和深拷贝,有篇文章非常简单清晰,推荐看一下:
http://blog.csdn.net/zhangjg_blog/article/details/18369201(里面有提及到单例模式和原型模式是冲突的,理解了这个,就差不多理解了这个两种模式了)
简单总结浅拷贝和深拷贝:浅拷贝是拷贝引用,深拷贝是拷贝了数据,但是存储空间是新的存储空间。(理解Java的引用传递后,这个很容易理解)

原型模式的目的:使对象的创建简单化(部分浅拷贝,即部分复制引用)

设计模式笔记五:原型模式相关推荐

  1. Java描述设计模式(05):原型模式

    一.原型模式简介 1.基础概念 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. 2.模式结构 原型模式要求对象实现一个 ...

  2. 大话设计模式读书笔记之原型模式

    由于大话这本书是以C#语言为基础写就的,本设计模式的例子中使用了一些c#中的API,因此就不再引用此书中的例子了,参考了一篇博客园中的大神写就的浅显易懂的JAVA版原型模式,在此奉上链接,以供大家学习 ...

  3. 【设计模式学习笔记】原型模式

    原型模式,估计这是最简单的模式了.这个模式可以用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式.额外说一句,这里的创建对象只是浅拷贝的. 文章目录 ...

  4. 设计模式五: 原型模式(Prototype)

    简介 原型模式是属于创建型模式的一种,是通过拷贝原型对象来创建新的对象. 万能的Java超类Object提供了clone()方法来实现对象的拷贝. 可以在以下场景中使用原型模式: 构造函数创建对象成本 ...

  5. 大话设计模式读书笔记--6.原型模式

    简单的复制粘贴极有可能造成重复代码的灾难, 但是java中提供了克隆的功能, 如果一个对象创建过程复杂,又要频繁使用, 在初始化信息不发生变化的情况下,应当采取克隆而不是new一个对象 定义 原型模式 ...

  6. 【设计模式 06】原型模式(克隆??)

    原型模式(clone?) Prototype pattern refers to creating duplicate object while keeping performance in mind ...

  7. java 设计模式 优缺点_java设计模式2:原型模式(机制\优缺点分析\使用场景)...

    1. 原型模式实现机制 原型模式在设计模式中相对比较简单,它直接通过实现 Cloneable接口,再重写 clone()方法返回想要的对象就OK 了. 一起来看下代码 : public class P ...

  8. Java设计模式5:原型模式

    原型模式 原型模式属于对象的创建模式,通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的用意. 原型模式结构 原型模式要求对象实现一个 ...

  9. 从王者荣耀看设计模式(五.组合模式)

    从王者荣耀看设计模式(组合模式) 一.简介 在王者荣耀这款游戏中,我们可以在商店中购买英雄.英雄由法师.射手.打野等职业组合而成,其中各个职业由中国元素的英雄和外国元素的英雄组成,玩家可根据需要挑选并 ...

最新文章

  1. OPPO R11巴萨限量版开售,上午10点线上线下火爆开启!
  2. 80行JavaScript代码实现的贪食蛇游戏,简约之美
  3. 第2章 状态机思维与状态机变量
  4. C#LeetCode刷题之#657-机器人能否返回原点(Robot Return to Origin)
  5. Linux命令查看电脑,linux查看文件大小命令
  6. CDQ分治题目泛做(WYD第二轮)
  7. come的喂abc是什么梗
  8. Java源文件的编译运行
  9. Breeze魔兽编程交流论坛
  10. 斩于马下 挑战木马克星:Ewido显神威(转)
  11. [技术]使用人工智能玩微信跳一跳
  12. 派生类的构造函数xu(c++)
  13. crontab每分钟执行一次任务
  14. Multimodal Fusion(多模态融合)
  15. 教你如何白嫖1TOneDrive云空间
  16. 外媒:朝鲜导弹发射失败或因美国网络攻击所致
  17. 文本分割之垂直投影法基于OpenCV(python)的实现
  18. MFC 多个RadioButton设为一组 vs2013
  19. json的存在意义(json和String的区别)
  20. 陶朗集团任命新总裁兼CEO;开利完成对广东积微集团的收购;宁德时代获大众集团电芯测试实验室认证 | 能动...

热门文章

  1. java电力巡检系统 项目讲解_公司召开安全巡检系统APP试点项目上线启动会
  2. 封装axios统一请求
  3. iOS 使用 socket 即时通信(非第三方库)
  4. 04_css盒子模型
  5. LOADRUNNER连接ORACLE数据库的方法
  6. 排序——宇宙总统(洛谷 P1781)
  7. 什么叫做java程序中的继承_【Java】基础16:什么叫继承?
  8. 一篇搞懂MySQL 8.0 Clone技术在线搭建主从复制全过程
  9. Linux 恢复rm -rf命令所删除的达梦数据文件
  10. 年终盘点:云上争锋,谁领国产数据库之先机?