Java学习笔记——设计模式之六.原型模式(浅克隆和深克隆)
That there's some good in this world, Mr. Frodo. And it's worth fighting for.

原型模式(prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
至于Object.clone()这里就不赘述了。文档看起来可能有些难懂,直接上代码反而更容易理解:
浅克隆:
package cn.happy.design_pattern._06prototype.shallowclone;
public abstract class Prototype {
private String id;
String getId() {
return id;
}
void setId(String id) {
this.id = id;
}
public abstract Prototype mClone();
}
package cn.happy.design_pattern._06prototype.shallowclone;
public class ConcretePrototype extends Prototype implements Cloneable{
private Obj obj;
public ConcretePrototype() {
super();
obj = new Obj();
}
/*
* getter and setter
*/
Obj getObj() {
return obj;
}
void setObj(Obj obj) {
this.obj = obj;
}
@Override
public Prototype mClone() {
// TODO Auto-generated method stub
Prototype prototype = null;
try {
prototype = (Prototype)this.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return prototype;
}
}
package cn.happy.design_pattern._06prototype.shallowclone;
public class Obj {
private String name;
String getName() {
return name;
}
void setName(String name) {
this.name = name;
}
}
package cn.happy.design_pattern._06prototype.shallowclone;
public class Mmain {
public static void main(String[] args) {
ConcretePrototype c1 = new ConcretePrototype();
ConcretePrototype c2 = (ConcretePrototype)c1.mClone();
c1.setId("原型");
c1.getObj().setName("张三");
c2.setId("副本");
c2.getObj().setName("李四");
/*
* 浅克隆:
* Id是值类型变量,逐位复制,产生新的变量地址;Obj是引用变量,只复制引用,副本和原型共享同一变量地址;
* 输出:prototype.shallowclone.ConcretePrototype@15db9742,原型,李四
* prototype.shallowclone.ConcretePrototype@6d06d69c,副本,李四
*/
System.out.println(c1+","+c1.getId()+","+c1.getObj().getName());
System.out.println(c2+","+c2.getId()+","+c2.getObj().getName());
}
}
这里需要提下两种特殊的值类型变量,字符串(其实字符串底层是char数组)和数组。它们虽然是引用类型但是可被浅克隆。大家一试便知。
深克隆:
Prototype 类不变。
package cn.happy.design_pattern._06prototype.deepclone;
public class ConcretePrototype extends Prototype implements Cloneable{
private Obj obj;
public ConcretePrototype() {
super();
obj = new Obj();
}
//添加新的构造方法
private ConcretePrototype(Obj obj) {
super();
this.obj = (Obj) obj.mClone();
}
/*
* getter and setter
*/
Obj getObj() {
return obj;
}
void setObj(Obj obj) {
this.obj = obj;
}
@Override
public Prototype mClone() {
// TODO Auto-generated method stub
Prototype prototype = null;
//调用新的构造方法
prototype = new ConcretePrototype(getObj());
prototype.setId(getId());
return prototype;
}
}
package cn.happy.design_pattern._06prototype.deepclone;
public class Obj implements Cloneable{
//省略属性,这里也许需要更深层克隆。
public Object mClone(){
Obj obj = null;
try {
obj = (Obj)this.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return obj;
}
}
测试类:
package cn.happy.design_pattern._06prototype.deepclone;
public class Mmain {
public static void main(String[] args) {
ConcretePrototype c1 = new ConcretePrototype();
ConcretePrototype c2 = (ConcretePrototype)c1.mClone();
/*
* 深克隆:c1与c2中Obj的地址不同了
* 输出:...ConcretePrototype@15db9742,null,...Obj@6d06d69c
* ...ConcretePrototype@7852e922,null,...Obj@4e25154f
*/
System.out.println(c1+","+c1.getId()+","+c1.getObj());
System.out.println(c2+","+c2.getId()+","+c2.getObj());
}
}
Java学习笔记——设计模式之六.原型模式(浅克隆和深克隆)的更多相关文章
- Java学习笔记——设计模式之四.代理模式
To be, or not to be: that is the question. --<哈姆雷特> 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 上代码: p ...
- Java学习笔记——设计模式之八.外观模式
外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 子系统: package cn.happy.design_patter ...
- Java学习笔记——设计模式之七.模板方法模式
模板方法模式(TemplateMethod),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 结构图: 代码: 算法骨架 ...
- C#设计模式之六原型模式(Prototype)【创建型】
一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...
- C#设计模式学习笔记:(5)原型模式
本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7640873.html,记录一下学习过程以备后续查用. 一.引言 很多人说原型设计模式会节省机器内存,他们说 ...
- Java学习笔记——设计模式之二.策略模式
明确是王道 --Clean Code 先定义策略类 package cn.no2.strategy; public abstract class Strategy { //省略属性 //算法方法 pu ...
- Java学习笔记——设计模式之九.建造者模式
建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Product类: package cn.happy.design_pattern._09b ...
- Java进阶篇设计模式之六 ----- 组合模式和过滤器模式
前言 在上一篇中我们学习了结构型模式的外观模式和装饰器模式.本篇则来学习下组合模式和过滤器模式. 组合模式 简介 组合模式是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来 ...
- Java学习笔记——设计模式之五.工厂方法
水边一只青蛙在笑 --石头和水 工厂方法模式(Factory Method),定义了一个用于创建对象的接口,让实现类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 这里在简单和工厂的基础上 ...
随机推荐
- POJ 1328 Radar Installation(经典贪婪)
Radar Installation Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 54143 Accepted: 12 ...
- ASP.NET Core 路由 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core 路由 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 路由 前两章节中,我们提到 ASP.NET Core 支持 MVC 开发 ...
- python两个整数和浮点的方法来获取值
/********************************************************************* * Author : Samson * Date ...
- 基于Linux C的socketEthereal程序和Package分析 (一个)
执行测试平台:CentOS 6.5发行版,内核版本号3.11 1. Linux抓包源程序 在OSI七层模型中.网卡工作在物理层和数据链路层的MAC子层. 进行网络通信时.源主机通过socket( ...
- 赵伟国辞去TCL集团董事等职位,紫光参与TCL定增浮盈已超7亿
集微网消息,TCL 集团于8月9日晚间发布公告称,公司董事会于近日收到董事赵伟国先生的书面辞职报告,赵伟国先生因个人原因申请辞去公司董事及公司战略委员会委员职务.辞任后,赵伟国先生不再担任公司任何职务 ...
- WPF 数据模板DataType属性的使用,不用指定ItemTemplate
<Window x:Class="CollectionBinding.MainWindow" xmlns="http://schemas.micros ...
- Sql 执行查询顺序
- WPF最大化避免覆盖任务栏
原文:WPF最大化避免覆盖任务栏 WPF当窗体WindowStyle=”None”时,最大化会覆盖掉任务栏.如何解决这个问题呢? 我在Google里面搜到一篇文章,要用到Win32 API,通过让WP ...
- 【C#】WPF的xaml中定义的Trigger为什么有时候会不管用,如Border的MouseOver之类的
原文:[C#]WPF的xaml中定义的Trigger为什么有时候会不管用,如Border的MouseOver之类的 初学WPF,知道一些控件可以通过定义Style的Trigger改变要显示的样式,但是 ...
- java中==和equels的区别
起初接触java的时候这个问题还是比较迷茫的,最近上班之余刷博客的时候看了一些大神写的文章,自己也来总结一下,直接贴代码: package string; public class demo1 { p ...