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

先看以下代码:

package com.meritit;public class Person {private String name;private int age;private String sex;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}}
package com.meritit;public class MainClass {public static void main(String[] args) {Person person1 = new Person();person1.setName("lisi");person1.setAge(30);person1.setSex("男");Person person2 = new Person();person2.setName("zhangsan");person2.setAge(30);person2.setSex("男");}
}

我们发现以上创建的两个对象的属性只有姓名不同,年龄和性别都相同,对于这样的代码我们怎么能优化一下。

下面我们来看一下原型模式的特点:

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

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

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

浅克隆:

package com.meritit;
//注意要实现Cloneable接口
public class Person implements Cloneable{private String name;private int age;private String sex;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}/*** 克隆方法*/public Person clone(){try {return (Person)super.clone();} catch (CloneNotSupportedException e) {return null;}}
}
package com.meritit;public class MainClass {public static void main(String[] args) {Person person1 = new Person();person1.setName("lisi");person1.setAge(30);person1.setSex("男");Person person2 = person1.clone();person2.setName("zhangsan");System.out.println(person1.getName());System.out.println(person2.getName());}
}

克隆和对象引用的关系如图:

所以克隆后对person2的修改是对person1没有影响的,既然这样为什么还分一个浅克隆和深度克隆?

下面我们给Person类再添加一个非基本类型的属性,看下面代码:

package com.meritit;import java.util.List;//注意要实现Cloneable接口
public class Person implements Cloneable{private String name;private int age;private String sex;private List<String> friends;  //非基本类型public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public List<String> getFriends() {return friends;}public void setFriends(List<String> friends) {this.friends = friends;}/*** 克隆方法*/public Person clone(){try {return (Person)super.clone();} catch (CloneNotSupportedException e) {return null;}}
}
package com.meritit;import java.util.ArrayList;
import java.util.List;public class MainClass {public static void main(String[] args) {Person person1 = new Person();person1.setName("lisi");person1.setAge(30);person1.setSex("男");List friends = new ArrayList<String>();friends.add("yaoming");friends.add("liwei");person1.setFriends(friends);Person person2 = person1.clone();person2.setName("zhangsan");//改变person1的非基本数据类型(对象)friends.add("man");person1.setFriends(friends);System.out.println(person1.getName());System.out.println(person1.getFriends());System.out.println(person2.getName());//会发现person2的friend属性也会改变System.out.println(person2.getFriends());}
}

从上面的例子可以看出,这样克隆只能克隆引用类型的地址,所以叫做浅克隆。

下面我们来深度克隆该对象:

package com.meritit;import java.util.ArrayList;
import java.util.List;//注意要实现Cloneable接口
public class Person implements Cloneable{private String name;private int age;private String sex;private List<String> friends;  //非基本类型public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public List<String> getFriends() {return friends;}public void setFriends(List<String> friends) {this.friends = friends;}/*** 克隆方法*/public Person clone(){try {Person person = (Person)super.clone();//再创建一个集合对象List<String> friends = new ArrayList<String>();for(String friend: this.getFriends()){friends.add(friend);}person.setFriends(friends);return person;} catch (CloneNotSupportedException e) {return null;}}
}

那么克隆都用在什么地方呢?

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

2、希望对目标对象的修改不影响既有的 原型对象(深度克隆完全可以不影响)

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

源代码下载地址:http://download.csdn.net/detail/lxq_xsyu/5907923

设计模式——原形模式相关推荐

  1. 设计模式之原形模式(克隆模式)

    Prototype设计模式之原形模式 Demo地址 https://github.com/rocky123shine/RockyPrototype 概念 原型模式又称为克隆模式. 用原型实例指定创建对 ...

  2. 第六章 Caché 设计模式 原型模式

    文章目录 第六章 Caché 设计模式 原型模式 定义 使用场景 优点 结构图 描述 示例 初级写法 缺点 中级写法 缺点 高级写法 (浅复制) 浅复制 深复制 完整示例 简历类(复制类) 对象类(工 ...

  3. Python设计模式-建造者模式

    Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...

  4. Python设计模式-状态模式

    Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...

  5. Python设计模式-备忘录模式

    Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...

  6. Python设计模式-解释器模式

    Python设计模式-解释器模式 代码基于3.5.2,代码如下; #coding:utf-8 #解释器模式class PlayContext():play_text = Noneclass Expre ...

  7. Python设计模式-命令模式

    Python设计模式-命令模式 代码基于3.5.2,代码如下; #coding:utf-8 #命令模式class barbecuer():def bakeButton(self):print(&quo ...

  8. Python设计模式-策略模式

    Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...

  9. Python设计模式-外观模式

    Python设计模式-外观模式 代码基于3.5.2,代码如下; #coding:utf-8 # 外观模式class AlarmSensor:def run(self):print("Alar ...

  10. Python设计模式-桥接模式

    Python设计模式-桥接模式 基于Python3.5.2,代码如下 #coding:utf-8class Shape():name = ""param = "" ...

最新文章

  1. 测试函数: Ackely,Rastrigin,Griewangk,SumSquartes,Sphere,Quartic,Schwefel' Problem 12等
  2. matlab直方图绘制
  3. 七.Hystrix Timeout机制
  4. java正则 环视_正则表达式之环视(java)
  5. 在windows7上的通过composer安装yii2
  6. PERL 实现微信登录
  7. mysql合并统计总数,mysql统计多表交织组合总数
  8. CMOS图像传感器——2021产品选谈
  9. java执行sql列名无效_嵌套异常是java.sql.SQLException:无效的列名ORACLE
  10. Qt工作笔记-使用QGraphicsItem绘制复杂的图形
  11. 机器学习(七)支持向量机svm中级篇
  12. javascript获取TreeView控件选中节点的Text和Value
  13. 【hashcat help中文注释】
  14. iphone通讯录导入excel
  15. 信息安全管理——仿射密码破解
  16. malloc,calloc区别
  17. 手机怎么模拟125k卡_NFC手机能模拟门禁卡吗?
  18. Chrome浏览器输入不安全站点,没有继续前往链接--解决方案thisisunsafe
  19. cad动态块制作翻转_CAD创建动态块实例教程:旋转参数和动作的应用 - CAD自学网...
  20. 路由器参数设置造成上网故障

热门文章

  1. 程序开发心理学第四篇
  2. 高通8953平台usb转以太网芯片ax88772驱动
  3. kotlin Android通过GPS定位/网络定位获取当前经纬度及位置信息
  4. SpringCloud微服务网关技术——Gateway网关的使用
  5. Matlab中图形对象属性gca使用
  6. 史上最详细Multi-grained Spatio-Temporal Features Perceived Network for Event-based Lip-Reading文章记录
  7. 代码随想录第六天 LeetCode 242、349、202、1 (哈希表)
  8. 关于WIN10开机自动开启小键盘解决方案
  9. 能快速修改视频格式的工具分享
  10. Java基础视频教程(2020年最新)