设计模式——原型模式(4)

一、写在前面

  • 创建型模式
    • 单例模式
    • 工厂方法模式
    • 抽象工厂模式
    • 原型模式
  • 建造者模式
  • 结构型模式
  • 行为型模式

二、介绍

  • 原型模式的思想是:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象
  • 原型模式的克隆分为浅克隆和深克隆。
    • 浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
    • 深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。
  • Java中的Object类中提供了 clone() 方法来实现浅克隆。

三、浅克隆

  • 浅克隆存在的问题是:如果A克隆出B,在B中修改非基本类型属性的值,那么A中的属性也会被修改
  • 补充:使用浅克隆可以在需要创建大量对象的情况下使用,比如游戏里的一个一个小兵,使用clone方法明显比使用new方法的代价小,因为使用new要从头开始执行分配内存和构造函数,而对于clone来说,本质上是在做复制的工作,代价比new小很多

四、深克隆

  • 深克隆中需要用到对象流,对象流的本质是将这个对象的所有属性都序列化,即:即便这个对象里有非基本数据类型,那么这个非基本数据类型也会被序列化成基本数据类型,这种做法非常巧妙,运用了对象流处理的机制
java 复制代码
public class CitationTest1 {
	public static void main(String[] args) throws Exception {
		Citation c1 = new Citation();
		Student stu = new Student("张三", "西安");
		c1.setStu(stu);
		//创建对象输出流对象
		ObjectOutputStream oos = new ObjectOutputStream(new
		FileOutputStream("C:\\Users\\Think\\Desktop\\b.txt"));
		//将c1对象写出到文件中
		oos.writeObject(c1);
		oos.close();
		//创建对象出入流对象
		ObjectInputStream ois = new ObjectInputStream(new
		FileInputStream("C:\\Users\\Think\\Desktop\\b.txt"));
		//读取对象
		Citation c2 = (Citation) ois.readObject();
		//获取c2奖状所属学生对象
		Student stu1 = c2.getStu();
		stu1.setName("李四");
		//判断stu对象和stu1对象是否是同一个对象
		System.out.println("stu和stu1是同一个对象?" + (stu == stu1));
		c1.show();
		c2.show();
	}
}
相关推荐
张较瘦_2 分钟前
[论文阅读] 软件工程 | 解决Java项目痛点:DepUpdater如何平衡依赖升级的“快”与“稳”
java·开发语言·论文阅读
老华带你飞4 分钟前
记录生活系统|记录美好|健康管理|基于java+Android+微信小程序的记录生活系统设计与实现(源码+数据库+文档)
android·java·数据库·vue.js·生活·毕设·记录生活系统
Seven9723 分钟前
微服务/分布式 基础面试题
java
weixin_4565881524 分钟前
JVM(java虚拟机)
java·开发语言·jvm
hygge99924 分钟前
JVM 内存结构、堆细分、对象生命周期、内存模型全解析
java·开发语言·jvm·经验分享·面试
小二·26 分钟前
Java虚拟机(JVM)面试题(51道含答案)
java·开发语言·jvm
无敌最俊朗@29 分钟前
03-事务高频面试总结
java·开发语言·jvm
hygge99936 分钟前
类加载机制、生命周期、类加载器层次、JVM的类加载方式
java·开发语言·jvm·经验分享·面试
一 乐1 小时前
海产品销售系统|海鲜商城购物|基于SprinBoot+vue的海鲜商城系统(源码+数据库+文档)
java·前端·javascript·数据库·vue.js·后端
大飞哥~BigFei3 小时前
RabbitMq消费延迟衰减重试实现思路
java·分布式·rabbitmq