原型模式,在笔者理解看来就是克隆,当我们在创建第一个对象时,已经给对象赋值完毕,此时我们需要一个当前对象的副本,如果没有原型模式,我们会再次创建一个对象,然后后二次赋值,保证两个对象完全一致,

这样我们的代码可读性就比较差,而且稍不留神copy错了麻烦就大了了,此时我们如果了解原型模式,就能够美化我们的代码,看起来够整洁,而且也不会出错。

大话设计模式-类图-浅复制

所谓的浅复制,就是对象中不包含引用类型,学习JAVA的小伙伴都知值引用和地址引用的区别吧,这里不再多说,如果还不了解的小伙伴可以自行百度下区别。

先上浅复制代码:

/**
* 简历对象
*/
public class Resume implements Cloneable{ private String name; private String age; private String company; public Resume() {
} public Resume(String name, String age) {
this.name = name;
this.age = age;
} @Override
protected Object clone() throws CloneNotSupportedException {
Resume resume = (Resume) super.clone();
return resume;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getAge() {
return age;
} public void setAge(String age) {
this.age = age;
} public String getCompany() {
return company;
} public void setCompany(String company) {
this.company = company;
} }
/**
* 客户端
*/
public class Test { public static void main(String[] args) throws CloneNotSupportedException {
Resume resume = new Resume("小菜", "25");
resume.setCompany("XXX-公司");
Resume resume1 = (Resume) resume.clone();
resume1.setCompany("AAA-公司");
System.out.println(resume.getName());
System.out.println(resume.getCompany());
System.out.println(resume1.getName());
System.out.println(resume1.getCompany());
}
}

输出结果:

小菜
XXX-公司
小菜
AAA-公司

以上是浅复制,均是String类型,现在需求有变更,工作经历属性变多,我们需要分对象,简历类里包含工作经验,显然浅复制无法复制引用类型,这里我们引入深复制

深复制代码如下:

/**
* 简历对象
*/
public class Resume implements Cloneable{ private String name; private String age; private WorkExperience workExperience; public Resume() {
workExperience = new WorkExperience();
} public Resume(String name, String age) {
this.name = name;
this.age = age;
workExperience = new WorkExperience();
} @Override
protected Object clone() throws CloneNotSupportedException {
Resume resume = (Resume) super.clone();
resume.setWorkExperience((WorkExperience) this.workExperience.clone());
return resume;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getAge() {
return age;
} public void setAge(String age) {
this.age = age;
} public WorkExperience getWorkExperience() {
return workExperience;
} public void setWorkExperience(WorkExperience workExperience) {
this.workExperience = workExperience;
}
}
/**
* 客户端
*/
public class Test { public static void main(String[] args) throws CloneNotSupportedException {
Resume resume = new Resume("小菜", "25");
resume.getWorkExperience().setCompany("XXX-公司"); Resume resume1 = (Resume) resume.clone();
resume1.getWorkExperience().setCompany("AAA-公司");
System.out.println(resume.getName());
System.out.println(resume.getWorkExperience().getCompany());
System.out.println(resume1.getName());
System.out.println(resume1.getWorkExperience().getCompany());
}
}

输出结果:

小菜
XXX-公司
小菜
AAA-公司

以上是笔者对原型模式的理解,希望能帮助学习原型模式的童鞋!

java 之 原型模式(大话设计模式)的更多相关文章

  1. java 的原型模式和clone

    原型模式是一种创建型设计模式,在java中可以直接调用object.clone(). 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多 ...

  2. java 之 适配器模式(大话设计模式)

    适配器模式,笔者不是很推荐在项目初期阶段使用,在笔者看来这个设计模式就是套接了一层,从而达到能够迎合现有的外部接口规范. 先来简单的看下类图: 大话设计模式-类图 这个模式理解起来非常简单,A→B因为 ...

  3. java 之 单例模式(大话设计模式)

    笔者记得去面试时曾被问起这个模式,当时还没有看过设计模式,对设计模式基本上一无所知,不过可以肯定的是笔者用过单例模式.当时回答的风马牛不相及,很尴尬. 也是从那时起,开始学习设计模式.今天所说的就是单 ...

  4. 大话设计模式(C#)

    还是那几句话: 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 问个问题: 如何写出高质量的代码?灵活,可扩展,易读,易维护,可重构,可复用. ...

  5. Java设计模式05:常用设计模式之原型模式(创建型模式)

    1. Java之原型模式(Prototype Pattern)     原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象. ...

  6. java 之 代理模式(大话设计模式)

    java代理模式顾名思义,就类似于大学,我想和冰可乐,可是我又在玩游戏,于是我让我的室友帮我把可乐带回来,简单的来说我的室友就是代理,而买可乐就是需要做的行为.这是笔者理解的代理模式 大话设计模式-类 ...

  7. Java 设计模式系列(五)原型模式

    Java 设计模式系列(五)原型模式 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是选型模式的用意. 一.原型模 ...

  8. 【设计模式】Java设计模式精讲之原型模式

    简单记录 - 慕课网 Java设计模式精讲 Debug方式+内存分析 & 设计模式之禅-秦小波 文章目录 1.原型模式的定义 原型-定义 原型-类型 2.原型模式的实现 原型模式的通用类图 原 ...

  9. JAVA设计模式 2【创建型】原型模式的理解与使用

    在本节中,我们将学习和使用原型模式:这一节学习的原型模式也是创建型 模式的其中之一.再次复习一下:创建型 模式就是描述如何去更好的创建一个对象. 我们都知道,在JAVA 语言中.使用new 关键字创建 ...

随机推荐

  1. Python学习笔记(九)

    Python学习笔记(九): 装饰器(函数) 内置函数 1. 装饰器 1. 作用域 2. 高阶函数 3. 闭包 如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就 ...

  2. MySQL基础函数

    MySQL数据库提供了很多函数包括: 数学函数: 字符串函数: 日期和时间函数: 条件判断函数: 系统信息函数: 加密函数: 格式化函数: 一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ...

  3. java 入门之八大内置基本类型

    本文采用eclipse 工具演示,如果您对eclipse 工具不了解,请先学习下 eclipse 工具的使用,这个里面只是简单的介绍下输出和注释: 安装完成eclipse 以后,双击进入 后一次点击 ...

  4. Mongodb的mongostat命令

    Mongodb的mongostat命令可实时(1秒钟刷新一次)显示Mongodb数据库的运行情况,可视为性能监视器. 1.启动命令:authenticationDatabase表示用户认证证书所在的数 ...

  5. Arduino.最小系统面包板搭建

    最早试过用万用板做过最小系统,主要用来烧录芯片 后来为了方便,用面包板也搭了一个最小系统, 但不采用杜邦线,因为飞来飞去的线太乱了 因此就有了这个简洁的版本,先上个成品图 用个烧录器就可以很方便的烧写 ...

  6. JDBC的基本用法

    一.编程步骤 1.加载驱动 Class forName("com.mysql.jdbc.Driver"):mysql驱动 Class forName("oralce.jd ...

  7. jquery ajax 数据传输

    在 form表单中,需要发送给后台的是一串长数据,后台才能接受,而用户则只需要输入字符串中的一部分,这种情况下,就需要将用户输入内容,和剩余部分进行拼串,然后添加进 formData 中传输. 另一种 ...

  8. Jenkins集成taffy进行自动化测试并输出测试报告

    本文主要介绍Jenkins集成taffy/nose框架进行自动化测试并输出测试报告方法. 0. 测试环境 Jenkis主节点部署在CentOS系统上,子节点为Win10 64位系统(即我们本机运行自动 ...

  9. Appium python自动化测试系列之自动化截图(十一)

    11.1 截图函数的正常使用 11.1.1 截图方法 无论是在手动测试还是自动化测试中场景复现永远是一个很重要的事情,有时候一些问题可能很难复现,这个都需要测试人员对bug有很高的敏感度,在一般的情况 ...

  10. Ipad,IPhone(矩阵求递推项+欧拉定理)

    Ipad,IPhone Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...