设计模式——原形模式
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
设计模式——原形模式相关推荐
- 设计模式之原形模式(克隆模式)
Prototype设计模式之原形模式 Demo地址 https://github.com/rocky123shine/RockyPrototype 概念 原型模式又称为克隆模式. 用原型实例指定创建对 ...
- 第六章 Caché 设计模式 原型模式
文章目录 第六章 Caché 设计模式 原型模式 定义 使用场景 优点 结构图 描述 示例 初级写法 缺点 中级写法 缺点 高级写法 (浅复制) 浅复制 深复制 完整示例 简历类(复制类) 对象类(工 ...
- Python设计模式-建造者模式
Python设计模式-建造者模式 代码基于3.5.2,代码如下; #coding:utf-8 #建造者模式 class Burger():name = ""price = 0.0d ...
- Python设计模式-状态模式
Python设计模式-状态模式 代码基于3.5.2,代码如下; #coding:utf-8 #状态模式class state():def writeProgram(self,work):raise N ...
- Python设计模式-备忘录模式
Python设计模式-备忘录模式 代码基于3.5.2,代码如下; #coding:utf-8 #备忘录模式 import randomclass gameCharacter():vitality = ...
- Python设计模式-解释器模式
Python设计模式-解释器模式 代码基于3.5.2,代码如下; #coding:utf-8 #解释器模式class PlayContext():play_text = Noneclass Expre ...
- Python设计模式-命令模式
Python设计模式-命令模式 代码基于3.5.2,代码如下; #coding:utf-8 #命令模式class barbecuer():def bakeButton(self):print(&quo ...
- Python设计模式-策略模式
Python设计模式-策略模式 代码基于3.5.2,代码如下; #coding:utf-8 #策略模式class sendInterface():def send(self,value):raise ...
- Python设计模式-外观模式
Python设计模式-外观模式 代码基于3.5.2,代码如下; #coding:utf-8 # 外观模式class AlarmSensor:def run(self):print("Alar ...
- Python设计模式-桥接模式
Python设计模式-桥接模式 基于Python3.5.2,代码如下 #coding:utf-8class Shape():name = ""param = "" ...
最新文章
- 测试函数: Ackely,Rastrigin,Griewangk,SumSquartes,Sphere,Quartic,Schwefel' Problem 12等
- matlab直方图绘制
- 七.Hystrix Timeout机制
- java正则 环视_正则表达式之环视(java)
- 在windows7上的通过composer安装yii2
- PERL 实现微信登录
- mysql合并统计总数,mysql统计多表交织组合总数
- CMOS图像传感器——2021产品选谈
- java执行sql列名无效_嵌套异常是java.sql.SQLException:无效的列名ORACLE
- Qt工作笔记-使用QGraphicsItem绘制复杂的图形
- 机器学习(七)支持向量机svm中级篇
- javascript获取TreeView控件选中节点的Text和Value
- 【hashcat help中文注释】
- iphone通讯录导入excel
- 信息安全管理——仿射密码破解
- malloc,calloc区别
- 手机怎么模拟125k卡_NFC手机能模拟门禁卡吗?
- Chrome浏览器输入不安全站点,没有继续前往链接--解决方案thisisunsafe
- cad动态块制作翻转_CAD创建动态块实例教程:旋转参数和动作的应用 - CAD自学网...
- 路由器参数设置造成上网故障
热门文章
- 程序开发心理学第四篇
- 高通8953平台usb转以太网芯片ax88772驱动
- kotlin Android通过GPS定位/网络定位获取当前经纬度及位置信息
- SpringCloud微服务网关技术——Gateway网关的使用
- Matlab中图形对象属性gca使用
- 史上最详细Multi-grained Spatio-Temporal Features Perceived Network for Event-based Lip-Reading文章记录
- 代码随想录第六天 LeetCode 242、349、202、1 (哈希表)
- 关于WIN10开机自动开启小键盘解决方案
- 能快速修改视频格式的工具分享
- Java基础视频教程(2020年最新)