`
linliuwei
  • 浏览: 33154 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

设计模式学习笔记(原型模式)

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

在Java中使用原型模式需要实现 java.lang.Cloneable 接口。对于有些构造函数要执行很长时间的对象,在不需要改变初始化信息的情况下使用克隆可以大大的提高性能。
Java API文档 写道

实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。
如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException 异常。
按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的)。
Object.clone 方法执行的是“浅复制”而不是“深复制”操作。


Java的浅复制与深复制概念,这里首先要理解Java的另一个概念,传值与传引用
1) 浅复制
浅复制的对象变量都含有和原来对象相同的值(这里变量指基本类型的变量,String类也算),但那些引用其他对象的变量仍然指向原来的对象。

2) 深复制
深复制的对象变量都含有和原来对象相同的值,但那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。

一个简单的浅复制代码事例,小狗复制成小猫
public class Food {
	public String name;
	public Food(String name) {
		this.name = name;
	}
}
//实现 java.lang.Cloneable 接口
public class Pet implements Cloneable {
	public String name;
	public int age;
	public List<Food> foods = new ArrayList<Food>();
	public Pet(String name, int age) {
		this.name = name;
		this.age = age;
	}
	@Override
	protected Pet clone()  {
		Pet copy = null;
		try {
			copy = (Pet) super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return copy;
	}
}
public class Test {
	
	public static void main(String[] args) {
		Pet source = new Pet("小狗", 2);
		source.foods.add(new Food("小狗爱吃狗粮"));
		Pet copy = source.clone();
		
		//修改前
		System.out.println("-----------值修改前-----------");
		System.out.println("source name: " + source.name);
		System.out.println(" source age: " + source.age);
		System.out.println("source food: " + source.foods.get(0).name);
		System.out.println("  copy name: " + copy.name);
		System.out.println("   copy age: " + copy.age);
		System.out.println("  copy food: " + copy.foods.get(0).name);
 
		System.out.println("-----------值修改后-----------");
		copy.name = "小狗变小猫";
		copy.age = 5;
		copy.foods.get(0).name = "小猫要吃猫粮";
		System.out.println("source name: " + source.name);
		System.out.println(" source age: " + source.age);
		System.out.println("source food: " + source.foods.get(0).name);
		System.out.println("  copy name: " + copy.name);
		System.out.println("   copy age: " + copy.age);
		System.out.println("  copy food: " + copy.foods.get(0).name);
	}
}

运行Test程序输出:
-----------值修改前-----------
source name: 小狗
 source age: 2
source food: 小狗爱吃狗粮
  copy name: 小狗
   copy age: 2
  copy food: 小狗爱吃狗粮

-----------值修改后-----------
source name: 小狗
 source age: 2
source food: 小猫要吃猫粮
  copy name: 小狗变小猫
   copy age: 5
  copy food: 小猫要吃猫粮


由此输出可见name与age字段都复制过来了,改变copy对象的值后source对象的值还是保持不变,但Pet对象中foods变量是一个List对象的引用,Object的clone方法是“浅复制”并没有复制变量引用的对象,因而copy对foods的修改就等于对source的修改。

要做到“深复制”在Java中有3种方式
1)所有对象都实现 java.lang.Cloneable 接口
2)利用Java的序列化和反序列化,要求所有对象都实现 java.io.Serializable 接口,如果有确实不可序列化的对象可使用 transient 关键字声明,从而将之排除在序列化之外
3)自己手动编码实现
1
0
分享到:
评论

相关推荐

    《设计模式学习笔记》

    《设计模式学习笔记》主要探讨了GOF的23种设计模式以及类设计的基本原则,旨在帮助开发者理解和应用这些经过时间验证的成熟解决方案。设计模式是面向对象软件设计中的核心概念,它们为解决常见的设计问题提供了标准...

    设计模式学习笔记大全

    以上就是压缩包中的设计模式学习笔记涉及到的主要内容。通过对这些模式的理解和应用,开发者可以更好地解决软件设计中的问题,提升软件的质量和可维护性。每种模式都有其适用场景,理解其背后的意图和应用场景是关键...

    HeadFirst设计模式学习笔记

    《HeadFirst设计模式学习笔记》是一份详尽的资料,旨在帮助读者深入理解并掌握设计模式这一编程领域的核心概念。设计模式是软件工程中的一种最佳实践,它在解决常见问题时提供了一种标准的解决方案,使得代码更易于...

    23种设计模式学习笔记

    这个“23种设计模式学习笔记”文档将引导你深入理解这些模式,并帮助你在实际编程中有效地应用它们。以下是对23种设计模式的详细解读: 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。它常用于控制...

    Java设计模式学习笔记.pdf

    在学习Java设计模式时,掌握其概念、应用、优点和缺点非常重要。设计模式是软件开发中经常使用的一种通用解决方案模板,用于解决特定上下文中的常见问题。它们源于设计模式的研究,通常被认为是软件设计中的最佳实践...

    设计模式学习笔记及其模式特点总结

    这些文档涵盖了设计模式的基础知识,通过阅读和学习,你可以深入了解每种模式的原理、应用场景及其实现方式,从而提升你的软件设计能力。绘图1.vsd可能是用于描绘设计模式的UML类图或其他图表,它能直观地展示各对象...

    尚硅谷设计模式源码笔记课件.zip

    共150讲,时长共 33...1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括...

    23种设计模式学习笔记及源码

    这个压缩包文件包含了23种设计模式的学习笔记和源码,旨在帮助开发者深入理解并熟练运用这些模式。以下是对每种设计模式的详细解释,以及它们在Java编程中的应用。 1. **单例模式**:确保一个类只有一个实例,并...

    #资源大人分享计划# 设计模式学习笔记.rar

    在这个“#资源大人分享计划# 设计模式学习笔记.rar”压缩包中,我们可以期待找到一系列关于设计模式的详细学习资料,包括定义、类图、代码示例以及各种使用场景,这些都将帮助我们深入理解并掌握设计模式。...

    设计模式学习笔记

    ### 设计模式学习笔记 #### 一、简单工厂模式 (Simple Factory) **类图与描述:** 简单工厂模式的核心在于存在一个工厂类,这个工厂类能够根据不同的输入参数返回不同的对象实例。简单工厂模式并不涉及继承关系,...

    java设计模式学习笔记,以及各种模式的代码实现

    6. **原型模式**:通过复制现有的对象来创建新对象,而不是通过实例化新类。在Java中,我们可以使用`clone()`方法或序列化来实现。 7. **适配器模式**:将一个类的接口转换成客户希望的另一个接口。适配器使原本...

    GoF 23种设计模式学习笔记

    "GoF 23种设计模式学习笔记" 是一个深入探讨这23个经典设计模式的资源,这些模式最初由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位作者在1994年的著作《设计模式:可复用面向对象软件的基础》中...

    23中设计模式学习笔记.docx

    ### 23种设计模式学习笔记 #### 一、软件设计模式的概念与意义 **概念:** 软件设计模式(Software Design Pattern),又称设计模式,是一套被广泛采用、经过整理和分类的代码设计经验总结。它针对软件设计过程中...

    Java 版设计模式学习笔记-java-design-patterns.zip

    这个“Java版设计模式学习笔记”涵盖了多种设计模式,旨在帮助开发者更好地理解和应用这些模式。让我们深入探讨一下其中可能包含的关键知识点。 一、单例模式 单例模式确保一个类只有一个实例,并提供一个全局访问...

    韩顺平_java设计模式笔记

    Java设计模式是软件开发中的一种最佳实践,它们是为了解决特定场景下的设计问题而发展起来的。...设计模式的学习对于成长为一名合格的软件工程师至关重要,因为它们体现了面向对象编程中的核心思想。

    设计模式笔记

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决问题的...设计模式笔记中的内容应该涵盖了以上所述的各种模式,通过深入学习和实践,你可以将这些模式应用到实际项目中,提升自己的编程技能和设计能力。

    《设计模式》学习笔记

    ### 设计模式学习笔记 #### 引言 设计模式(Design Patterns)是在软件设计领域内广泛应用的一种实践指南,它提供了一系列解决常见问题的方案。设计模式可以被理解为面向对象软件设计的经验总结,是对特定面向对象...

    根据《JAVA与设计模式》整理的笔记及示例代码

    这份"根据《JAVA与设计模式》整理的笔记及示例代码"涵盖了Java语言和设计模式的核心概念,旨在帮助开发者理解和应用这些模式。 一、设计模式的基本概念 设计模式是对在特定情境下软件设计问题的解决方案的一种描述...

Global site tag (gtag.js) - Google Analytics