一、什么是原型模式

Prototype模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例。使用Prototype模式创建的实例,具有与原型一样的数据

二、原型模式的特点

1.由原型对象自身创建目标对象。也就是说,对象创建这一动作发自原型对象本身。

2.目标对象是原型对象的一个克隆。也就是说,通过Prototype模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值。

3.根据对象克隆深度层次的不同,有浅度克隆深度克隆

三、原型模式应用场景

- 在创建对象的时候,我们不只是希望被创建的对象继承其基类的基本结构,还希望继承原型对象的数据。

- 希望对目标对象的修改不影响既有的原型对象(深度克隆的时候可以完全互不影响)。

- 隐藏克隆操作的细节。很多时候,对对象本身的克隆需要涉及到类本身的数据细节。

四、例子

Person类实现了Clonable接口,该接口和Serializable一样,仅仅是一个标志,表明该类可以被克隆。同时它提供了一个clone方法,需要注意的是clone方法是Object中的方法,Person进行了重写。

public class Person implements Cloneable{private String name;private int age;private String sex;

    public Person clone() {try {Person person  = (Person)super.clone();            return  person;} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}//省略了setter和getter

}

public class MainClass {public static void main(String[] args) {//Person1Person person1 = new Person();person1.setName("lifengxing");//nameperson1.setAge(30);//ageperson1.setSex("男");//sexList<String> friends = new ArrayList<String>();friends.add("James");friends.add("Yao");person1.setFriends(friends);//friends//0.克隆Person1得到person2Person person2 = person1.clone();//1.验证person1和person2的所有属性值System.out.println(person2.getName());//lifengxingSystem.out.println(person2.getAge());//30System.out.println(person2.getSex());//男System.out.println(person2.getFriends());//[James, Yao]//2.验证基本属性//person1变性person1.setSex("女");System.out.println("person1变性为"+person1.getSex());//性别变为女System.out.println("person2依旧为"+person2.getSex());//性别仍为男//3.验证引用属性//person1多了一个朋友kittyList<String> li = person1.getFriends();li.add("kitty");person1.setFriends(li);System.out.println("person1现在的朋友:"+person1.getFriends());//[James, Yao, kitty]System.out.println("person2现在的朋友:"+person2.getFriends());//[James, Yao, kitty]

}

0处调用clone方法生成了新的对象,1处通过打印结果可知克隆后的对象与原对象属性值完全一样。

但是仅仅通过打印结果相同并不能说明person2就一定是引用了一个新创建的对象,难道就不可能是person2指向了person1吗,也就是Person person2=person1;

于是,2处进行验证:

  将person1进行变性,打印结果显示虽然person1确实变性成功,但是person2根本不受影响。这也就说明clone操作一定是创建了新的对象。

  3处进一步验证:person1由于变性后魅力大增,结识了新的朋友kitty,打印结果发现person2也多了一个kitty朋友。为什么跟上面的不一致了呢?

这里涉及了深克隆和浅克隆的知识。

要想对person1进行深克隆,只需要在clone方法中手动对引用(复杂)类型的属性手动克隆一下就行了。

public class Person implements Cloneable{private String name;private int age;private String sex;private List<String> friends;public Person clone() {try {Person person  = (Person)super.clone();//a.手动对引用类型的属性friends进行克隆List<String> clonefriends = new ArrayList<String>();clonefriends.addAll(this.getFriends());person.setFriends(clonefriends);return  person;} catch (CloneNotSupportedException e) {e.printStackTrace();return null;}}
}

再次运行程序,结果就是person2完全不受person1影响了,也就是person2对person1进行了深克隆。

转载于:https://www.cnblogs.com/rouqinglangzi/p/6880731.html

原型模式-prototype相关推荐

  1. 原型模式(ProtoType) - Java里的对象复制

    一, 引用的复制和对象复制. 在编程中, 我们有时会用两个引用指向同一个对象. 例如: ArrayList a = new ArrayLIst(); ArrayList b = a; 看起来好像有a, ...

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

    [索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...

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

    C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...

  4. 原型模式(Prototype Pattern)

    原型模式(Prototype Pattern) 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...

  5. Java设计模式--原型模式Prototype

    原型模式Prototype 原型模式使得用户可以通过复制对象样本来创建新对象.与通过调用构造函数创建对象相比,二者主要区别在于:通过复制创建的新对象一般会包含原始对象的某些状态. 原型模式属于对象的创 ...

  6. 设计模式(23):创建型-原型模式(Prototype)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  7. 设计模式之原型模式(Prototype)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

  8. 设计模式之原型模式prototype

    1.原型模式的使用和本质.以及优势: a.通过 new 产生一个对象需要非常繁琐的数据准备或者访问权限,则可以使用原型模式. b.原型模式的使用就是 java 中的克隆技术,以某个对象为原型,复制出新 ...

  9. 设计模式---原型模式(Prototype Pattern)

    在编程中有时候我们会发现,当我们需要一个实例,可是这个实例的创建过程十分复杂,在执行过程中 会消耗大量的时间,同时创建第一个实例和创建第二个时间的初始化信息并未改变.在此种情况下,直接New 一个实例 ...

最新文章

  1. vector,数组,动态数组效率测试
  2. 封装CoreGraphics的API简化绘图操作
  3. 看似无参却有参-----JS中的函数传参
  4. 上半年产品原型设计Axure rp稿(持续更新)
  5. 京津冀产业协同升级 智慧城市等高端产业需求遇热
  6. 京东健康将开启首批新冠抗原自测产品线上预约
  7. 设计灵感|如何设计出简洁吸引人的字体海报?
  8. androidtv item获取焦点设置动画和背景_动画技术的交互应用所作的动画
  9. 文章内部设置目录,锚点
  10. 王立平--android事件监听的3种方式
  11. 你对jstl了解多少----JSTL标签之函数(慎用)
  12. ubuntu wifi
  13. 洛谷——P1422 小玉家的电费
  14. wincc安装信息服务器,WinCC 7.4软件不会安装?怎么授权?一文教会你
  15. 使用vue开发的网易云音乐播放器
  16. Failed to sync vcpu reg
  17. 泰拉瑞亚服务器怎么修改密码,泰拉瑞亚账号系统功能使用说明 怎么绑定手机号...
  18. 单细胞论文记录(part19)--A comprehensive comparison on cell-type composition inference for ST data
  19. 腾讯系统测试一面+二面+HR面(面经)
  20. 游戏策划---ACTIONGAME游戏设计(转)

热门文章

  1. 数据结构与算法基础-02
  2. [译] ASP.NET 生命周期 – ASP.NET 应用生命周期(一)
  3. 1.5节 卡诺图以及布尔代数(SOP,POS)part1
  4. 走近Flex组件系列(四):分组组件(Box)、分割组件(DividedBox)和容器组件(Panel)
  5. Django项目部署:使用uwsgi和nginx的方式
  6. 从0到1简易区块链开发手册V0.6-实现打印区块
  7. 51CTO博客——架起我与读者沟通、见面的桥梁[博友话题]
  8. 【免费】微信群讲座:如何成为专家
  9. 使用Maven开发Hadoop
  10. getgrgid()函数