java设计模式-克隆模式(复制模式)
java中有深克隆和浅克隆的说法,clone方法在Object类中,该方法被protect修饰,我们无法直接调用,只能实现Cloneable接口,重写clone方法,我们举个作家和书本的栗子说明
首先解释深克隆,创建作家类
public class Person implements Cloneable{private String name;private String gender;private int age;public Person(String name, String gender, int age) {this.name = name;this.gender = gender;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public void display(){System.out.println("姓名:"+this.name+"性别:"+this.gender+"年龄:"+this.age);}public Object clone(){Person p = null;try {p = (Person)super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return p;}@Overridepublic String toString() {return "name=" + name + ", gender=" + gender + ", age=" + age ;}
}
然后创建书籍类
ublic class BookForDeep implements Cloneable {private String bookName;private double price;private Person author;public BookForDeep(String bookName, double price, Person author) {this.bookName = bookName;this.price = price;this.author = author;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}public Person getAuthor() {return author;}public void setAuthor(Person author) {this.author = author;}public void display() {System.out.println("书名:" + bookName + " 价格: " + price + "作者:" + author);}public String toString() {return "bookName: " + bookName + "price: " + price + "author:" + author;}public Object clone() throws CloneNotSupportedException {BookForDeep bfp = null;bfp = (BookForDeep) super.clone();bfp.setAuthor((Person) super.clone());return bfp;}
}
我们写一个测试类
public class TestBookForDeepClone {public static void main(String[] args) {BookForDeep bfd1 = new BookForDeep("Hadoop权威指南", 0.01, new Person("xiaoli", "female", 23));BookForDeep bfd2 = new BookForDeep("spark高级详解", 0.01, new Person("azhong", "male", 24));System.out.println(bfd1.getAuthor() == bfd2.getAuthor());bfd1.display();bfd2.display();}
}
测试结果
false
书名: Hadoop权威指南 价格: 0.01作者:name=xiaoli, gender=female, age=23
姓名:xiaoli性别:female年龄:23
书名: spark高级详解 价格: 0.01作者:name=azhong, gender=male, age=24
姓名:azhong性别:male年龄:24
我们再类测试浅克隆
创建BookForDeep类实现Cloneable在这里我们需要修改clone方法,其他地方一样
public Object clone() throws CloneNotSupportedException {return super.clone();}
写一个测试类,测试浅克隆
public class TestBookLowClone {public static void main(String[] args) throws CloneNotSupportedException {Book book1 = new Book("Hadoop权威指南", 0.1, new Person("阿中", "male", 24));Book book2 = (Book) book1.clone();System.out.println(book1.getAuthor());System.out.println(book2.getAuthor());System.out.println(book1.getAuthor() == book2.getAuthor());book1.display();book2.display();
// 浅拷贝的问题:当更新副本中属性指向的对象内容时 原对象的属性会跟着一起变化// 因为原对象中属性的对象与副本中属性的对象是同一个对象book2.getAuthor().setName("Allen");book2.getAuthor().setGender("female");book1.display();book2.display();}
}
运行结果
name=阿中, gender=male, age=24
name=阿中, gender=male, age=24
true
书名: Hadoop权威指南价格: 0.1作者:name=阿中, gender=male, age=24
姓名:阿中性别:male年龄:24
书名: Hadoop权威指南价格: 0.1作者:name=阿中, gender=male, age=24
姓名:阿中性别:male年龄:24
书名: Hadoop权威指南价格: 0.1作者:name=Allen, gender=female, age=24
姓名:Allen性别:female年龄:24
书名: Hadoop权威指南价格: 0.1作者:name=Allen, gender=female, age=24
姓名:Allen性别:female年龄:24
java设计模式-克隆模式(复制模式)相关推荐
- Java设计模式(装饰者模式-组合模式-外观模式-享元模式)
Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...
- java设计模式4--建造者模式(Builder)
本文地址:http://www.cnblogs.com/archimedes/p/java-builder-pattern.html,转载请注明源地址. 建造者模式 将一个复杂对象的构建与它的表示分离 ...
- Java设计模式-观察者模式(订阅发布模式)
Java设计模式-观察者模式(订阅发布模式) 一起来看 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持吧!! ...
- 适配接口 java_【Java 设计模式】接口型模式--Adapter(适配器)模式
简介:[Java设计模式]接口型模式–Adapter(适配器)模式Adapter模式的宗旨就是:向客户提供接口,并使用现有的类所提供的服务,以满足客户的需求. 或者说,现在有classA的方法满足客户 ...
- java设计模式2-观察者模式
java设计模式2-观察者模式 什么是观察者模式? 何谓观察者模式?观察者模式定义了对象之间的一对多依赖关系,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且自动更新. 在这里,发生改变 ...
- Java设计模式之中介者模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
- Java设计模式之享元模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
- java设计模式3种工厂模式
java设计模式3种工厂模式 2010-01-08 16:06:36| 分类: JAVA技术|举报|字号 订阅 下载LOFTER客户端 工厂模式分为三种: Simple Factory模式 专门定义 ...
- Java 设计模式 Adapter 对象适配器 模式
Java 设计模式 Adapter 对象适配器 模式 Adapter模式用于现有的程序无法直接使用,需要做适当的变换之后才能使用的情况. 涉及到的角色 Target对象:定义所需的方法. Client ...
- Java设计模式10,建造者模式
目录 一.建造者模式 二.建造者模式的结构 1.抽象建造者(Builder) 2.具体建造者(ConcreteBuilder) 3.指挥者(Director) 4.产品(Product) 三.建造者模 ...
最新文章
- TCP/IP详解--学习笔记(9)-TCP协议概述
- 应用开发之WinForm开发
- 什么时候我们应谈及性能?
- 高校教师抄袭豆瓣博主文章,学校证实:基本属实!记过并调离教学科研岗位...
- JavaScript实现封闭区域布尔运算
- (软件工程复习核心重点)第七章软件维护习题
- 只显示小方格_excel中最有效率的插件——方方格子
- python爬虫步骤-Python爬虫怎么入门-初级篇
- Leetcode 5067.统计只含单一字母的子串
- Galaxy Fold上市时间推延 屏幕瑕疵是主因
- 2021年高压电工模拟考试系统及高压电工考试试题
- MEMS传感器的下一轮技术变革
- 如何取得/etiantian文件的权限对应的数字内容,如-rw-r--r-- 为644,要求使用命令取...
- 杂文-61儿童节-太阳的距离
- php内存设置,修改php运行内存大小的限制
- mac 查看端口使用情况
- 程序猿,你关心过自己的健康吗?
- br-lan、eth0、eth1及lo
- 在Linux下安装hping3
- n平方的求和公式_n的二次方怎么求和?