原型模式创建对象不调用原对象的构造函数,是直接copy原对象的浅克隆:对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象.深克隆:对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制.
/** * Created by marcopan on 17/10/20. */public class Prototype implements Cloneable {    private String name;

    public String getName() {        return name;    }

    public void setName(String name) {        this.name = name;    }

    public Object clone() {        try {            return super.clone();        } catch (CloneNotSupportedException e) {            e.printStackTrace();            return null;        }    }}
/** * Created by marcopan on 17/10/20. */public class NewPrototype implements Cloneable {    private String id;    private Prototype prototype;

    public String getId() {        return id;    }

    public void setId(String id) {        this.id = id;    }

    public Prototype getPrototype() {        return prototype;    }

    public void setPrototype(Prototype prototype) {        this.prototype = prototype;    }

    public Object clone() {        NewPrototype ret = null;        try {            ret = (NewPrototype)super.clone();            ret.prototype = (Prototype)this.prototype.clone();            return ret;        } catch (CloneNotSupportedException e) {            e.printStackTrace();            return null;        }    }

    public static void main(String[] args) {        Prototype pro = new Prototype();        pro.setName("original object");        NewPrototype newObj = new NewPrototype();        newObj.setId("test1");        newObj.setPrototype(pro);

        NewPrototype clonObj = (NewPrototype)newObj.clone();        clonObj.setId("testClone");        clonObj.getPrototype().setName("changed object");

        System.out.println("original object id:" + newObj.getId());        System.out.println("original object name:" + newObj.getPrototype().getName());

        System.out.println("cloned object id:" + clonObj.getId());        System.out.println("cloned object name:" + clonObj.getPrototype().getName());    }}运行结果:

original object id:test1
original object name:original object
cloned object id:testClone
cloned object name:changed object


转载于:https://www.cnblogs.com/panning/p/7701136.html

Prototype模式相关推荐

  1. Factory模式与Prototype模式的异同

    原型模式与工厂模式的定义,本文不想在这讲太多,本文主要想在这讲一下对原型模式的一些误解--将原型模式等价于工厂模式: 为什么会产生这种误导呢?其实也不是我们的错,关键在于设计模式这本书以及网上的其它资 ...

  2. java设计模式:prototype模式

    prototype模式是在对象相似时使用.其是复制对象,并设置新的特征. interface Prototype {void setSize(int x);void printSize(); }cla ...

  3. 设计模式--原型(Prototype)模式

    模式定义 指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 类图 应用场景 当代码不应该依赖于需要复制的对象的具体类时 优点 1.以不耦合具体类的情况下克隆对象: 2.避免重复的初始化代 ...

  4. 设计模式4-创建型模式-Prototype模式

    意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型对象创建新的对象. 原型模式的结构比较简单,在使用C++实现该模式时重点要注意deep copy和shallow copy的问题. protot ...

  5. 设计模式 - Prototype模式(原型模式)

      作用: 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. UML结构图: 抽象基类: 1)Prototype:虚拟基类,所有原型的基类,提供Clone接口函数接口函数: 1)Pro ...

  6. 设计模式-Prototype模式(原型模式)

    目录 原型模式是什么? 为什么要用原型模式? 原型模式是什么? Prototype模式:不根据类来生成实例,而是根据实例来生成新实例. 怎么理解呢?举个例子,就是比如现在我们只有两个类,球(Ball) ...

  7. Java设计模式之从[魔兽世界副本]分析原型(Prototype)模式

    "副本"是网络游戏任务的一种形式,它最初出现于无尽的任务,现在运用得最有名的就是魔兽世界的副本了,我们将它称为副本任务.副本任务一般是一个队伍的人一起闯关的,假设有队伍A.队伍B. ...

  8. 建造者模式与原型模式/builder模式与prototype模式/创建型模式

    建造者模式 定义 用于简化复杂对象的创建 JDK中的建造者模式 java.lang.StringBuilder中的append()方法,每次调用后返回修改后的对象本身. public StringBu ...

  9. 设计模式学习笔记五——Prototype模式

    动机:使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象.某些结构复杂对象面临着剧烈变化,但拥有比较稳定一致的接口,如何隔离出这些易变对象,使客户程序不随之改变? 场景:ThinkPa ...

最新文章

  1. mysql udf提权_MySQL日志安全分析技巧
  2. 平时用到那些linux命令,工作中经常用到的linux命令,你知道多少?
  3. VTK:网格之AddCell
  4. 人工智能“训练员”让 AI 更聪明
  5. Eureka-服务注册
  6. ios解锁动态图片_iOS 苹果开机启动的 滑动来解锁动画
  7. cookies与session
  8. 清华学霸直博简历火了:CPU、操作系统、编译器全自己写
  9. python 学习过程总结
  10. 在 iOS 客户端上通过 bitcode 为第三方库修复 bug
  11. 【模拟】NCPC 2014 E ceremony
  12. 面试官:你是如何调用 wait() 方法的?使用 if 还是 while?别答错了!
  13. UVa232.Crossword Answers
  14. Linux抓包命令tcpdump
  15. 英文环境中Wine微信不能显示中文
  16. JS实现数组和数组对象倒序(reverse方法)
  17. Android 自定义视频录制终极解决方案(翻转问题)
  18. python是个坑_Python 有什么不为人知的坑?
  19. C语言——兔子繁殖问题多解
  20. 4.千万日活的系统如何统计UV?

热门文章

  1. 创建线程的方式_创建线程有几种不同的方式?
  2. 【Pytorch神经网络实战案例】12 利用注意力机制的神经网络实现对FashionMNIST数据集图片的分类
  3. 图像目标分割_1 概述
  4. 就业阶段-java语言进价_day03
  5. python为什么不会溢出_深入分析python中整型不会溢出问题
  6. pwn和逆向的区别_Pwn之简单patch
  7. 十二、PHP框架Laravel学习笔记——构造器的查询表达式
  8. LeetCode 1760. 袋子里最少数目的球(二分查找)
  9. 支持向量机(Support Vector Machines,SVM)
  10. LeetCode 455. 分发饼干(贪心)