当前位置: 首页 > news >正文

设计模式学习-原型模式

1.定义

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

2.类图

3.代码示例

 1 package com.zhaoyangwoo.prototype;
 2 
 3 /**
 4  * Created by john on 16/5/8.
 5  */
 6 public class Prototype {
 7     public static void main(String[] args){
 8         Product p1= new Product();
 9         p1.setName("nihao");
10         p1.setAge(2);
11         Product p2 = p1.clone();
12         System.out.println(p2.getName());
13     }
14 }
15 
16 
17 class Product implements Cloneable{
18     String name;
19 
20     Integer age;
21 
22     public Product() {
23         System.out.println("调用构造方法");
24     }
25 
26 
27     public String getName() {
28         return name;
29     }
30 
31     public void setName(String name) {
32         this.name = name;
33     }
34 
35     public Integer getAge() {
36         return age;
37     }
38 
39     public void setAge(Integer age) {
40         this.age = age;
41     }
42 
43     @Override
44     public Product clone() {
45         try {
46             return (Product)super.clone();
47         } catch (CloneNotSupportedException e) {
48             e.printStackTrace();
49         }
50         return null;
51     }
52 }

4.应用场景举例

  • 一个对象被多个对象使用并且需要修改
  • 类型需要多个对象但是对象的初始化消耗巨大 

5.JDK源码中的模式实现

  在jdk源码中,凡事实现了Cloneable接口的类均使用了此模式。例如我们经常说的Calendar类

public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>

6.思考

  • 原型模式和构造函数

java的原型模式已经在语言中实现。只需要实现Cloneable接口,该接口没有任何实现,只是一个标志。如果没有该接口但是却重写了clone方法,使用时会报异常。

另外java中的原型是直接二进制拷贝,性能客观,这也就能说明复制出来的实体是没有执行构造函数。

 
 
  • 深复制和浅复制

二进制流的拷贝是浅复制,对于基础类型当然生成新的备份,但是对于引用类型,新老实体对应的都是同一个引用地址。所有如果实体类有引用类型的字段,那么请在

clone方法中重新为引用类型的字段分配空间赋值。

 

转载于:https://www.cnblogs.com/zhaoyanghoo/p/5470766.html

相关文章:

  • Centos 基础开发环境搭建之Maven私服nexus
  • HDU 2098 分拆素数和
  • 设计模式——9.装饰模式
  • unable to start the virtual device;Genymotion启动安卓模拟器出错
  • MapReduce编程job概念原理
  • 转载 asp.net的Request.ServerVariables参数说明
  • Extjs 学习总结-代理
  • consul笔记
  • Java设计模式图文详解
  • swift-分支
  • 2016/05/19 thinkphp 3.2.2 文件上传
  • 如何升级CentOS 6.5下的MySQL
  • Linux系统命令查询软件包
  • 第十二周学习进度
  • ios实用wifi分析仪——AirPort
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • 2017年终总结、随想
  • axios请求、和返回数据拦截,统一请求报错提示_012
  • gops —— Go 程序诊断分析工具
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • JavaScript 基本功--面试宝典
  • Java读取Properties文件的六种方法
  • Java应用性能调优
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Python 基础起步 (十) 什么叫函数?
  • python大佬养成计划----difflib模块
  • STAR法则
  • 安装python包到指定虚拟环境
  • 从零开始学习部署
  • 讲清楚之javascript作用域
  • 码农张的Bug人生 - 初来乍到
  • 收藏好这篇,别再只说“数据劫持”了
  • 首页查询功能的一次实现过程
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 交换综合实验一
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​LeetCode解法汇总518. 零钱兑换 II
  • (06)金属布线——为半导体注入生命的连接
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (超详细)语音信号处理之特征提取
  • (十八)三元表达式和列表解析
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (转)负载均衡,回话保持,cookie
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET Framework .NET Core与 .NET 的区别
  • .net mvc部分视图
  • .NET 发展历程
  • .net反编译的九款神器
  • .NET中winform传递参数至Url并获得返回值或文件
  • .NET中使用Protobuffer 实现序列化和反序列化
  • /3GB和/USERVA开关
  • [100天算法】-二叉树剪枝(day 48)
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [BZOJ2850]巧克力王国