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学习笔记——设计模式之六.原型模式(浅克隆和深克隆)的更多相关文章

  1. Java学习笔记——设计模式之四.代理模式

    To be, or not to be: that is the question. --<哈姆雷特> 代理模式(Proxy),为其他对象提供一种代理以控制对这个对象的访问. 上代码: p ...

  2. Java学习笔记——设计模式之八.外观模式

    外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 子系统: package cn.happy.design_patter ...

  3. Java学习笔记——设计模式之七.模板方法模式

    模板方法模式(TemplateMethod),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 结构图: 代码: 算法骨架 ...

  4. C#设计模式之六原型模式(Prototype)【创建型】

    一.引言 在开始今天的文章之前先说明一点,欢迎大家来指正.很多人说原型设计模式会节省机器内存,他们说是拷贝出来的对象,这些对象其实都是原型的复制,不会使用内存.我认为这是不对的,因为拷贝出来的每一个对 ...

  5. C#设计模式学习笔记:(5)原型模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7640873.html,记录一下学习过程以备后续查用.  一.引言 很多人说原型设计模式会节省机器内存,他们说 ...

  6. Java学习笔记——设计模式之二.策略模式

    明确是王道 --Clean Code 先定义策略类 package cn.no2.strategy; public abstract class Strategy { //省略属性 //算法方法 pu ...

  7. Java学习笔记——设计模式之九.建造者模式

     建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Product类: package cn.happy.design_pattern._09b ...

  8. Java进阶篇设计模式之六 ----- 组合模式和过滤器模式

    前言 在上一篇中我们学习了结构型模式的外观模式和装饰器模式.本篇则来学习下组合模式和过滤器模式. 组合模式 简介 组合模式是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来 ...

  9. Java学习笔记——设计模式之五.工厂方法

    水边一只青蛙在笑 --石头和水 工厂方法模式(Factory Method),定义了一个用于创建对象的接口,让实现类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 这里在简单和工厂的基础上 ...

随机推荐

  1. Swift程式语言(中国版)(8.8 %)

    前言 今天Apple宣布了一项新的编程语言Swift.还提供了一个近400页The Swift Programming Language(Swift程式语言). 虽然我没有开发者账户.不能实际锻炼机S ...

  2. 1.开始第一个MVC项目

    安装就不说了 1.在指定路径创建好项目文件夹之后,打开cmd,进去这个文件夹路径下 输入命令 dotnet new mvc 就会在文件夹内创建一个mvc项目 2.创建好项目之后 直接在这个路径下输入 ...

  3. 七easy网络陷阱上当

    网络犯罪可能开始与你或你的家人,因为无论出现什么样的警告信息,或异常体征,你还是做你通常做在互联网上,网络犯罪已经发生不知道.趋势科技收集了你所该避免的七种最常见的网络犯罪陷阱.让你和家人避免成为它们 ...

  4. arcserver开发小结(一)

    一.关于属性查询 由于要做属性查询,又重新玩起了arcmap中的select by attribute,有很多自己当初玩弄arcmap多年还不是很清楚的东西 1,字段名 (1)file geodata ...

  5. Excel 2013永久取消超链接

    原文:Excel 2013永久取消超链接 在使用Excel的过程中,Excel会自动将网址转换为超链接,操作不当,容易误点,引起不必要的错误, 那么本篇博客就总结下如何在Excel 2013里永久取消 ...

  6. hdu 4035 可能性DP 成都网络游戏

    http://acm.hdu.edu.cn/showproblem.php?pid=4035 获得: 1.首先推断是不是树.事实上,所有的感觉身影,既看边数==算-1是不成立 2.有时候,我告诉孩子来 ...

  7. 关于hibernate一对一配置

    实体类关系 一对一 一对多 多对一 多对多 Hibernate提供了两种映射一对一关联关系的方式:按照外键映射和按照主键映射.下面以员工账号和员工档案表为例,介绍这两种映射方式,并使用这两种映射方式分 ...

  8. Bootstrap 标签徽章巨幕页头

    @{    Layout = null;}<!DOCTYPE html><html><head>    <meta name="viewport&q ...

  9. WPF 自定义范围分组

    <Window x:Class="ViewExam.MainWindow"        xmlns="http://schemas.microsoft.com/w ...

  10. .NET 图片像素比较

    /// <summary> /// 图像比较.用于找出两副图片之间的差异位置 /// </summary> public class ImageComparer { /// & ...