`

原型模式

 
阅读更多
<!--StartFragment-->

    原型模式虽然很简单, 但是在 Java 中使用原型模式也就是 clone 方法还是有一些注意事项的, 我们通

    过几个例子一个一个解说(如果你对 Java 不是很感冒的话, 可以跳开以下部分)。


 

对象拷贝时, 类的构造函数是不会被执行的。

一个实现了 Cloneable 并重写了 clone 方法的类 A, 有一个无参构造或有参构造 B,

通过 new 关键字产生了一个对象 S, 再然后通过 S.clone() 方式产生了一个新的
对象 T, 那么在对象拷贝时构造函数 B 是不会被执行的。

 

<!--StartFragment-->

   对象拷贝时确实构造函数没有被执行, 这个从原理来讲也是可以讲得通的, Object 类的 clone 方法的

  原理是从内存中(具体的说就是堆内存) 以二进制流的方式进行拷贝, 重新分配一个内存块, 那构造函数

  没有被执行也是非常正常的了。

 

  <!--StartFragment-->

  浅拷贝和深拷贝问题

<!--StartFragment-->

Java 做了一个偷懒的拷贝动作,Object 类提供的方法 clone 只是拷贝本对象,

其对象内部的数组、 引用对象等都不拷贝, 还是指向原生对象的内部元素地址, 这种拷贝就叫做浅拷贝

确实是非常浅, 两个对象共享了一个私有变量, 你改我改大家都能改, 是一个种非常不安全的方式, 在实

际项目中使用还是比较少的。 你可能会比较奇怪, 为什么在 Mail 那个类中就可以使用使用 String 类型,

而不会产生由浅拷贝带来的问题呢? 内部的数组和引用对象才不拷贝其他的原始类型比如

int,long,String(Java 就希望你把 String 认为是基本类型,String 是没有 clone 方法的) 等都会被拷贝的

 

深拷贝的示例代码:

package PrototypePattern;

import java.util.ArrayList;

public class Mail implements Cloneable{

	private String title;
	
	private String reciver;
	
	private ArrayList<String> list = new ArrayList<String>();
	
	@SuppressWarnings("unchecked")
	@Override
	protected Mail clone() {
		
		Mail mail = null;
		
		try {
			
			mail = (Mail) super.clone();
			
			ArrayList<String> cloneList = (ArrayList<String>) list.clone();
			mail.setList(cloneList);
			
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		
		return mail;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getReciver() {
		return reciver;
	}

	public void setReciver(String reciver) {
		this.reciver = reciver;
	}

	public ArrayList<String> getList() {
		return list;
	}

	public void setList(ArrayList<String> list) {
		this.list = list;
	}
	
}

 

<!--EndFragment--><!--EndFragment--><!--EndFragment--><!--EndFragment-->
分享到:
评论

相关推荐

    设计模式之原型模式

    原型模式是设计模式中的一种,它是Java 23种经典设计模式之一,主要用来提高对象创建的效率。在原型模式中,我们通过复制或克隆一个已经存在的对象来创建新的对象,而不是通过构造函数来创建。这种方法尤其适用于当...

    设计模式的原型模式的例子

    原型模式(Prototype Pattern)是软件设计模式中的一种结构型模式,它的主要目的是通过复制已有对象来创建新对象,从而减少创建新对象的成本。在原型模式中,类的实例化过程被替换为对已有实例的克隆操作,尤其适用...

    设计模式之原型模式Java实现和类设计图

    原型模式(Prototype Pattern)是其中一种行为设计模式,主要用于对象创建。它通过复制已有对象来创建新对象,而不是通过传统的构造函数来创建。在Java中,原型模式可以有效地提高性能,特别是在创建复杂对象时。 #...

    iOS设计模式之原型模式

    本文将深入探讨一种常见的设计模式——原型模式(Prototype Pattern),并结合具体的iOS应用场景进行解析。 原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而不是通过构造函数来创建...

    android设计模式之原型模式

    本文将深入探讨Android设计模式中的“原型模式”(Prototype Pattern),并结合提供的"prototype"压缩包中的示例代码进行解析。 原型模式是一种创建型设计模式,它的主要思想是通过复制已有对象来创建新对象,而...

    设计模式C++学习之原型模式(Prototype)

    本篇文章将深入探讨“原型模式(Prototype)”这一经典的设计模式,它是面向对象设计的一个重要概念,尤其在C++编程中有着广泛的应用。 原型模式是一种创建型设计模式,它的核心思想是通过复制已有对象来创建新对象,...

    c++20设计模式-第4章-原型模式代码

    原型模式(Prototype Pattern)是其中一种行为设计模式,它允许我们通过复制现有对象来创建新对象,而不是通过传统方式实例化新对象。这一模式尤其适用于创建复杂或昂贵的对象,因为它提供了对象克隆的能力,从而...

    Java 23种设计模式08原型模式.pdf

    ### Java设计模式之原型模式深度解析 #### 模式动机 在面向对象编程的世界里,对象的创建往往伴随着复杂的逻辑处理。特别是在某些场景下,对象的构造过程可能涉及大量资源的消耗,例如数据库连接、文件读写等。在...

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】 * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 ...

    软件设计模式 - 原型模式PPT

    原型模式(Prototype Pattern)是软件设计模式中的一种创建型模式,它的核心在于利用已有的一个原型对象,通过复制这个原型对象创建出新的对象。这种方法可以避免重复的初始化操作,或者避免重复的构造过程带来的...

    ava常用设计模式-原型模式

    ava常用设计模式-原型模式 原型模式(Prototype Pattern)是一种创建型设计模式,允许通过复制现有对象来创建新对象,而不是通过实例化类来创建新对象。在需要创建大量相似对象时非常有用,它可以避免重复创建对象...

    23种设计模式详解PDF

    设计模式 的分类 总体来说设计模式分为三大类: 创建型模式(5): 工厂方法模式 、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式(7): 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、...

    设计模式之原型模式.docx

    【设计模式之原型模式】 设计模式是软件工程中的一种最佳实践,是对在特定上下文中反复出现的软件设计问题的解决方案。原型模式属于对象创建型模式,它的主要思想是通过复制已有对象来创建新对象,降低了类的实例化...

    C#23种设计模式样例代码和UML图

    C#23种设计模式样例代码和UML图等 创建型模式(抽象工厂模式、工厂方法模式、单例模式、建造者模式、原型模式); 行为型模式(策略模式、 迭代器模式、原型模式、职责链模式、 模板方法、 命令模式、 解释器模式、 ...

    前端设计模式大全,包括工厂模式,原型模式,构造器模式等

    本资料集包含了多种重要的前端设计模式,如工厂模式、原型模式和构造器模式,下面将详细阐述这些模式的核心概念和应用。 1. 工厂模式: 工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,通过抽象出...

    Java 经典设计模式讲解以及项目实战

    Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...

Global site tag (gtag.js) - Google Analytics