<!--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)是软件设计模式中的一种结构型模式,它的主要目的是通过复制已有对象来创建新对象,从而减少创建新对象的成本。在原型模式中,类的实例化过程被替换为对已有实例的克隆操作,尤其适用...
原型模式(Prototype Pattern)是其中一种行为设计模式,主要用于对象创建。它通过复制已有对象来创建新对象,而不是通过传统的构造函数来创建。在Java中,原型模式可以有效地提高性能,特别是在创建复杂对象时。 #...
原型模式(Prototype Pattern)是一种创建型设计模式,它允许我们通过复制现有的对象来创建新对象,而无需知道具体创建过程的细节。这种模式的核心在于,它提供了一种对象克隆的简便方法,使得对象的创建过程对用户...
原型模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在原型模式中,一个对象可以被克隆以创建新对象,而无需知道具体的创建细节。这种模式在需要重复创建相似对象时非常有用,避免了每次创建新对象时都...
本篇文章将深入探讨“原型模式(Prototype)”这一经典的设计模式,它是面向对象设计的一个重要概念,尤其在C++编程中有着广泛的应用。 原型模式是一种创建型设计模式,它的核心思想是通过复制已有对象来创建新对象,...
原型模式(Prototype Pattern)是其中一种行为设计模式,它允许我们通过复制现有对象来创建新对象,而不是通过传统方式实例化新对象。这一模式尤其适用于创建复杂或昂贵的对象,因为它提供了对象克隆的能力,从而...
### Java设计模式之原型模式深度解析 #### 模式动机 在面向对象编程的世界里,对象的创建往往伴随着复杂的逻辑处理。特别是在某些场景下,对象的构造过程可能涉及大量资源的消耗,例如数据库连接、文件读写等。在...
ava常用设计模式-原型模式 原型模式(Prototype Pattern)是一种创建型设计模式,允许通过复制现有对象来创建新对象,而不是通过实例化类来创建新对象。在需要创建大量相似对象时非常有用,它可以避免重复创建对象...
【设计模式之原型模式】 设计模式是软件工程中的一种最佳实践,是对在特定上下文中反复出现的软件设计问题的解决方案。原型模式属于对象创建型模式,它的主要思想是通过复制已有对象来创建新对象,降低了类的实例化...
设计模式 的分类 总体来说设计模式分为三大类: 创建型模式(5): 工厂方法模式 、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式(7): 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、...
C#23种设计模式样例代码和UML图等 创建型模式(抽象工厂模式、工厂方法模式、单例模式、建造者模式、原型模式); 行为型模式(策略模式、 迭代器模式、原型模式、职责链模式、 模板方法、 命令模式、 解释器模式、 ...
JDK中许多类和方法都使用了设计模式,这些模式的应用帮助实现了代码的高内聚、低耦合,提高了代码的可维护性和扩展性。下面介绍几种常见的设计模式及其在JDK中的应用实例: a) 抽象工厂模式(AbstractFactory) ...
本资料集包含了多种重要的前端设计模式,如工厂模式、原型模式和构造器模式,下面将详细阐述这些模式的核心概念和应用。 1. 工厂模式: 工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式,通过抽象出...
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高...
设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式。 2.结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 4.行为型模式:...