java 原型模式之浅拷贝

浅拷贝:java Ojbect类提供的clone只是拷贝本对象,其对象内部的数组和引用对象等都不拷贝,还是指向原生对象的内部元素地址。

类引用的成员变量必须满足两个条件才不会被拷贝:1.是类的成员变量而不是方法内变量;2必须是一个可变的引用对象,而不是一个原始类型或者不可变对象(包括int、long、char等及其对象类型[Integer、Long]、String)

测试代码:

import java.util.ArrayList;
import java.util.List;

public class Thing implements Cloneable{

    String s = null;
    Integer i = null;

    private List<String> list = new ArrayList<String>();

    public Thing(String s,int i) {
        System.out.println("init");
        this.s = s;
        this.i = i;
    }

    public void setS(String s) {
        this.s = s;
    }

    public void println() {
        System.out.println( this.s + "\t" + this.i + "\t" + this.list.toString());
    }

    public void setI(Integer i) {
        this.i = i;
    }

    public void setValue(String value) {
        this.list.add(value);
    }

    public Thing clone() {
        try {
            return (Thing) super.clone();
        } catch (CloneNotSupportedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        Thing t = new Thing("one",7);
        t.setValue("list1");

        Thing clone = (Thing) t.clone();
        t.setS("SECOND");
        t.setI(10);
        t.setValue("list2");
        System.out.print("t:");
        t.println();
        System.out.print("clone:");
        clone.println();
    }
}

运行结果:

init
t:SECOND    10    [list1, list2]
clone:one    7    [list1, list2]
时间: 2024-08-07 08:36:36

java 原型模式之浅拷贝的相关文章

Java原型模式之浅拷贝-深拷贝

一.是什么? 浅拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量仅仅复制引用,不复制引用的对象 深拷贝:对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制 内部机制: (1)关于Object类的clone方法 默认实现为"浅拷贝",重写Object类中的clone方法.Java中全部类的父类都是Object类,Object类中有一个clone方法.作用是返回对象的一个拷贝,可是其作用域是protected类型的,一般的类无法调用,因此Prototype类

java原型模式

原型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 原型模式结构图 通俗来说:原型模式就是深拷贝和浅拷贝的实现. 浅拷贝 只实现了值拷贝,对于引用对象还是指向原来的对象. 父类实现clone方法,子类没有实现clone方法,其效果是浅拷贝. 父类实现clone方法,子类也实现clone方法,本来我想应该是深拷贝了,没想到也是浅拷贝. package com.prototype; import java.io.Serializable; public

Java原型模式(Prototype模式)

Prototype模式定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建. 如何使用原型模式 因为Java中的提供clone()方法来实现对象的克隆,所以Prototype模式实现一下子变得很简单.以勺子为例: public abstract class Abstrac

Java 原型模式(克隆模式)

  Java 的设计模式有 23 种,前段时间小编已经介绍了单例模式,由于我们在学习 Spring 的时候在 bean 标签的学习中碰到了今天要讲的原型模式,那么小编就已本文来介绍下原型模式. 原型模式  在java中我们知道通过new关键字创建的对象是非常繁琐的(类加载判断,内存分配,初始化等),在我们需要大量对象的情况下,原型模式就是我们可以考虑实现的方式.  原型模式我们也称为克隆模式,即一个某个对象为原型克隆出来一个一模一样的对象,该对象的属性和原型对象一模一样.而且对于原型对象没有任何

Java原型模式(思维导图)

图1 原型模式[点击查看大图] 1,原型对象 public class Prototype implements Cloneable{ public Prototype clone(){ Prototype prototype=null; try{ prototype=(Prototype)super.clone(); }catch (CloneNotSupportedException e){ e.printStackTrace(); } return prototype; } } class

iOS与Java原型设计模式,欢迎扫二维码加入订阅号进行讨论

什么是原型模式 什么时候用到原型模式 原型模式有那些优缺点 oc与java语法上原型模式有那些异同及简单的例子 首先看什么是原型模式: java:Specify the kinds of objects to create using a prototypical instance, and create new objects by copying this prototype.(用原型实例制定创建对象的种类,并且创建一个新的对象从原型对象拷贝而来.) iOS:客户端知道抽象prototype

原型模式之基础

一.是什么? 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.(官方定义) 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype.Prototype类需要具备以下两个条件: 1.实现Cloneable接口.在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法.在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedExce

设计模式解密(18)- 原型模式

1.简介 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型来创建新的对象. 功能:①是通过克隆来创建新的对象实例:②是为克隆出来的新的对象实例复制原型实例属性的值. 本质:通过克隆来创建新的对象实例. 英文:Prototype 类型:创建型 2.类图及组成 (引)类图: 组成: Prototype:声明一个克隆自身的接口,用来约束想要克隆自己的类,要求它们都要实现这里定义的克隆方法. ConcretePrototype:实现Prototype接口的类,这些类真正实现了克隆自身的功能. C

Java中的深拷贝和浅拷贝 原型模式

1: Java中浅拷贝和深拷贝的定义:      浅拷贝:就是指两个对象共同拥有同一个值,一个对象改变了该值,也会影响到另一个对象.      深拷贝:就是两个对象的值相等,但是互相独立. (深拷贝才是真正的拷贝,浅拷贝只是将引用指向了同一份对象) 2:Java中几种常见的拷贝操作: (1)"="操作:也就是赋值操作: (2)拷贝构造函数:拷贝构造函数就是构造函数的参数的类型是该构造函数所在的类,即参数就是该类的一个对象. <span style="font-size: