原型模式&clone的学习

详解Java中的clone方法?原型模式 Java中对象的创建   clone顾名思义是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象呢?   1 使用new操作符创建一个对象   2 使用clone方法复制一个对象   那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存。程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化,构造方法返回后 立即下载

克隆羊问题:

 有一只名叫Tom,年龄为1,毛为白色的羊。请编写程序创建和Tom羊属性完全一致的10只羊。
 

传统方法:

在这里插入图片描述
代码:

public class Sheep {
    private String name;
    private int age;
    private String color;

    public Sheep(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }

    //get() && set()
}
public class Client {
    public static void main(String[] args) {
        Sheep sheep = new Sheep("Tom", 1, "白色");

        Sheep sheep1 = new Sheep(sheep.getName(),sheep.getAge(),sheep.getColor());
        Sheep sheep2 = new Sheep(sheep.getName(),sheep.getAge(),sheep.getColor());
        Sheep sheep3 = new Sheep(sheep.getName(),sheep.getAge(),sheep.getColor());
        //...
    }
}

 

缺点:

 在创建新的对象时,总是需要重新获得原始对象的属性,如果创建的对象比较复杂时,效率较低。

 总是需要重新初始化对象,而不是动态地获得对象运行时的状态,不够灵活。

改进的思路:

 Java的最大类Object,提供一个克隆方法clone()。实现clone方法需要实现一个接口Cloneable,该接口表示实现类能够复制并且具有复制的能力。=》【原型模式】

 

原型模式

 用原型实例指定创建对象的种类,并通过拷贝这些原型,创建新的对象。

 允许一个对象再创建另外一个可定制对象,而无需知道创建的细节。

 工作原理:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建,即对象.clone()
 

原型模式结构

在这里插入图片描述 1.原型 (Prototype) 接口将对克隆方法进行声明。 在绝大多数情况下, 其中只会有一个名为 clone克隆的方法。
 2.具体原型 (Concrete Prototype) 类将实现克隆方法。 除了将原始对象的数据复制到克隆体中之外, 该方法有时还需处理克隆过程中的极端情况, 例如克隆关联对象和梳理递归依赖等等。
 3.客户端 (Client) 可以复制实现了原型接口的任何对象。

 

原型模式适合应用场景

 1.如果你需要复制一些对象, 同时又希望代码独立于这些对象所属的具体类, 可以使用原型模式。
 2.如果子类的区别仅在于其对象的初始化方式, 那么你可以使用该模式来减少子类的数量。 别人创建这些子类的目的可能是为了创建特定类型的对象。

 

实现方式

 1.创建原型接口, 并在其中声明 克隆方法。 如果你已有类层次结构, 则只需在其所有类中添加该方法即可。

 2.原型类必须另行定义一个以该类对象为参数的构造函数。 构造函数必须复制参数对象中的所有成员变量值到新建实体中。 如果你需要修改子类, 则必须调用父类构造函数, 让父类复制其私有成员变量值。

 如果编程语言不支持方法重载, 那么你可能需要定义一个特殊方法来复制对象数据。 在构造函数中进行此类处理比较方便, 因为它在调用 new运算符后会马上返回结果对象。

 3.克隆方法通常只有一行代码: 使用 new运算符调用原型版本的构造函数。 注意, 每个类都必须显式重写克隆方法并使用自身类名调用 new运算符。 否则, 克隆方法可能会生成父类的对象。

 4.你还可以创建一个中心化原型注册表, 用于存储常用原型。

 你可以新建一个工厂类来实现注册表, 或者在原型基类中添加一个获取原型的静态方法。 该方法必须能够根据客户端代码设定的条件进行搜索。 搜索条件可以是简单的字符串, 或者是一组复杂的搜索参数。 找到合适的原型后, 注册表应对原型进行克隆, 并将复制生成的对象返回给客户端。

 最后还要将对子类构造函数的直接调用替换为对原型注册表工厂方法的调用。
 

原型模式优缺点

 优点:
  ✔️你可以克隆对象, 而无需与它们所属的具体类相耦合。
  ✔️你可以克隆预生成原型, 避免反复运行初始化代码。
  ✔️你可以更方便地生成复杂对象。
  ✔️你可以用继承以外的方式来处理复杂对象的不同配置。
 
 缺点:
  ❌克隆包含循环引用的复杂对象可能会非常麻烦

更改后的克隆羊项目

public class Sheep implements Cloneable{
    private String name;
    private int age;
    private String color;


    public Sheep(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }
    
    protected Object clone(){
        Sheep sheep = null;

        try {
            sheep = (Sheep) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        
        return sheep;
    }
}

public class Client {
    public static void main(String[] args) {
        Sheep sheep = new Sheep("Tom", 1, "白色");

        Sheep sheep1 = (Sheep) sheep.clone();
        Sheep sheep2 = (Sheep) sheep.clone();
        Sheep sheep3 = (Sheep) sheep.clone();
        //...
    }
}

 

探讨浅拷贝和深拷贝问题

 

 浅拷贝

​   对于基本类型和String类型的成员变量,浅拷贝会直接进行值传递。

​   对于引用数据类型的成员变量,浅拷贝会进行引用传递(传地址)。则两个对象都会指向同一个实例。在这种情况下,一个对象修改该成员变量会对另一个对象产生影响。

​   实现方法:super.clone()默认的clone方法

 

代码的问题展示

​ 拷贝对象

public class CloneAbleTarget implements Cloneable {
    public String name;
    public int age;
    public CloneAbleTarget cloneAbleTarget;

    public CloneAbleTarget(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public CloneAbleTarget(String name, int age, CloneAbleTarget cloneAbleTarget) {
        this.name = name;
        this.age = age;
        this.cloneAbleTarget = cloneAbleTarget;
    }

    @Override
    public String toString() {
        return "CloneAbleTarget{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", cloneAbleTarget=" + cloneAbleTarget +
                '}';
    }

    @Override
    protected Object clone()  {
        CloneAbleTarget cloneAbleTarget = null;

        try {
            cloneAbleTarget = (CloneAbleTarget) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        return cloneAbleTarget;
    }
}

test

public class Client {
    public static void main(String[] args) {
        CloneAbleTarget c1 = new CloneAbleTarget("C1",22,new CloneAbleTarget("C1_1",12));

        CloneAbleTarget c2 = (CloneAbleTarget) c1.clone();

        System.out.println(c1);//{name='C1', age=22, cloneAbleTarget=CloneAbleTarget{name='C1_1', age=12, cloneAbleTarget=null}}
        System.out.println(c2);//{name='C1', age=22, cloneAbleTarget=CloneAbleTarget{name='C1_1', age=12, cloneAbleTarget=null}}

        //此时修改c2的相关属性
        c2.name="C2";
        c2.age = 11;
        c2.cloneAbleTarget.name="C2_2";
        c2.cloneAbleTarget.age=13;

        //进行输出 查看哪些成员变量变了
        System.out.println(c1); //{name='C1', age=22, cloneAbleTarget=CloneAbleTarget{name='C2_2', age=13, cloneAbleTarget=null}}
        System.out.println(c2); //{name='C2', age=11, cloneAbleTarget=CloneAbleTarget{name='C2_2', age=13, cloneAbleTarget=null}}

        /*
            从结果对比可知 c2修改了引用类型,c1的引用类型也随之变化。【地址传递】
         */
    }
}

 

 深拷贝

  ​ 拷贝对象的所有基本类型,并为所有的引用类型变量申请存储空间,并复制每个成员变量所引用的对象。
 

实现方式

1.重写clone方法来实现深拷贝

​  引用类型类

public class DeepCloneabeTarget implements Cloneable {
    private String cloneName;
    private String cloneClass;

    public DeepCloneabeTarget(String cloneName, String cloneClass) {
        this.cloneName = cloneName;
        this.cloneClass = cloneClass;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

​ 复制类

public class DeepProtoType implements Cloneable {
    private String name;
    private DeepCloneabeTarget deepCloneabeTarget;

    public DeepProtoType(String name, DeepCloneabeTarget deepCloneabeTarget) {
        this.name = name;
        this.deepCloneabeTarget = deepCloneabeTarget;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public DeepCloneabeTarget getDeepCloneabeTarget() {
        return deepCloneabeTarget;
    }

    public void setDeepCloneabeTarget(DeepCloneabeTarget deepCloneabeTarget) {
        this.deepCloneabeTarget = deepCloneabeTarget;
    }

    @Override
    public String toString() {
        return "DeepProtoType{" +
                "name='" + name + '\'' +
                ", deepCloneabeTarget=" + deepCloneabeTarget +
                '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Object deep = null;
        //复制基本类型+String类型
        deep = super.clone();
        //对引用类型,单独处理
        DeepProtoType deepProtoType = (DeepProtoType) deep;
        deepProtoType.deepCloneabeTarget = (DeepCloneabeTarget) deepCloneabeTarget.clone();

        return deepProtoType;
    }
}

test

public class Client {
    public static void main(String[] args) throws CloneNotSupportedException {
        DeepProtoType deep1 = new DeepProtoType("Tom",new DeepCloneabeTarget("Name_clone","Class_clone"));

        DeepProtoType deep2 = (DeepProtoType) deep1.clone();

        System.out.println(deep1);//{name='Tom', deepCloneabeTarget=com.rz.prototype.DeepCloneabeTarget@3d075dc0}
        System.out.println(deep2);//{name='Tom', deepCloneabeTarget=com.rz.prototype.DeepCloneabeTarget@214c265e}
        /*
            从结果上看 对象和复制对象的引用类型成员变量的地址不同。则深拷贝成功
         */
    }
}

 

2.通过对象序列化实现深拷贝

​  引用类型类

public class DeepCloneabeTarget implements Serializable{
    private String cloneName;
    private String cloneClass;

    public DeepCloneabeTarget(String cloneName, String cloneClass) {
        this.cloneName = cloneName;
        this.cloneClass = cloneClass;
    }

    @Override
    public String toString() {
        return "DeepCloneabeTarget{" +
                "cloneName='" + cloneName + '\'' +
                ", cloneClass='" + cloneClass + '\'' +
                '}';
    }
}

​ 复制类

public class DeepProtoType implements Serializable,Cloneable {
    private String name;
    private DeepCloneabeTarget deepCloneabeTarget;

    public DeepProtoType(String name, DeepCloneabeTarget deepCloneabeTarget) {
        this.name = name;
        this.deepCloneabeTarget = deepCloneabeTarget;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public DeepCloneabeTarget getDeepCloneabeTarget() {
        return deepCloneabeTarget;
    }

    public void setDeepCloneabeTarget(DeepCloneabeTarget deepCloneabeTarget) {
        this.deepCloneabeTarget = deepCloneabeTarget;
    }

    @Override
    public String toString() {
        return "DeepProtoType{" +
                "name='" + name + '\'' +
                ", deepCloneabeTarget=" + deepCloneabeTarget +
                '}';
    }

    @Override
    protected Object clone(){
        //创建流对象
        ByteArrayOutputStream bos = null;
        ObjectOutputStream oos = null;
        ByteArrayInputStream bis = null;
        ObjectInputStream ois = null;

        try {
            //序列化
            bos = new ByteArrayOutputStream();
            oos = new ObjectOutputStream(bos);
            oos.writeObject(this); //使这个对象以对象流的方式输出

            //反序列化
            bis = new ByteArrayInputStream(bos.toByteArray());
            ois = new ObjectInputStream(bis);
            DeepProtoType copyObj = (DeepProtoType) ois.readObject();

            return copyObj;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            //关闭流
            try {
                ois.close();
                bis.close();
                bos.close();
                oos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

test

public class Client {
    public static void main(String[] args) throws CloneNotSupportedException {
        DeepProtoType deep1 = new DeepProtoType("Tom",new DeepCloneabeTarget("Name_clone","Class_clone"));

        DeepProtoType deep2 = (DeepProtoType) deep1.clone();

        System.out.println(deep1+" "+deep1.getDeepCloneabeTarget().hashCode());
        System.out.println(deep2+" "+deep2.getDeepCloneabeTarget().hashCode());
        /*
            DeepProtoType{name='Tom', deepCloneabeTarget=DeepCloneabeTarget{cloneName='Name_clone', cloneClass='Class_clone'}} 1650967483
            DeepProtoType{name='Tom', deepCloneabeTarget=DeepCloneabeTarget{cloneName='Name_clone', cloneClass='Class_clone'}} 1604839423
            从结果上看 对象和复制对象的引用类型成员变量的地址不同。则深拷贝成功
         */
    }
}

 

原型模式的一些细节

​  1.创建新对象较为复杂时,可以利用原型模式简化创建过程,提升效率

​  2.不用重新初始化对象,而是动态地获取对象运行时的状态

​  3.如果原始对象发生变化【增加或较少属性】,则克隆对象也会发生改变

​  4.在实现深拷贝时推荐反序列化的方法

需要给每个类都配置克隆方法,则会对已有的类进行改造,违背了OCP原则。

Cursor集成Claude 4.6免费版:本地IDE合规调用指南 大语言模型编程助手(LLM Copilot)已成为现代开发标配,其核心能力依赖于上下文理解、代码推理与结构化输出等关键技术原理。Anthropic官方提供的Claude系列模型,尤其Claude 4.6,凭借200K超长上下文、tool use函数调用和严格可控的API设计,在工程实践中展现出显著技术价值。该能力可无缝嵌入本地IDE环境,支撑代码解释、跨文件分析、单元测试生成等高频开发场景。本文聚焦Cursor这一开源可审计IDE,详解如何合规复用Anthropic免费tier接口(/v1/messages 阅读详情

相关推荐

ADS1293心电图模块实战:从电极贴片到信号采集的全流程指南

本文提供了一份基于TI ADS1293芯片的心电图采集系统全流程实战指南。文章深入探讨了从电极贴片选择与皮肤预处理、ADS1293前端配置(包括PGA、RLD和威尔逊网络),到PCB布局、电源去耦以及固件滤波与运动伪影处理等关键环节,旨在帮助硬件工程师和嵌入式开发者构建稳定可靠的可穿戴心电监测设备。

weixin_29201313的博客 384

原型(克隆)模式

原型模式的重心还是在创建新的对象实例,至于创建出来的对象,其属性的值是否一定要和原型对象属性的值完全一样,这个并没有强制规定,只不过在目前大多数实现中,克隆出来的对象和原型对象的属性值是一样的。原型模式可以在运行期间,由客户来注册符合原型接口的实现类型,也可以动态地改变具体的实现类型,看起来接口没有任何变化,但其实运行的已经是另外一个类实例了。克隆是手段,目的是生成新的对象实例。原型模式的客户端只知道原型接口的类型,并不知道具体的实现类型,从而减少了客户端对这些具体实现类型的依赖。

Filwaod 2196

IntelliJ IDEA 中git使用说明书

IntelliJ IDEA 中git使用说明书

junyang2012的博客 5389

详解原型模式的clone方法

Java中对象的创建 clone就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象呢? 1 使用new操作符创建一个对象 2 使用clone方法复制一个对象 那么这两种方式有什么相同和不同呢? new操作符的本意是分配内存。程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造

ruanyandong的博客 771

告别手动脚本!用TSMaster Python小程序5分钟搞定CAN报文自动发送

本文介绍了如何使用TSMaster的Python小程序功能快速实现CAN报文自动发送,大幅提升汽车电子测试效率。通过简洁的Python代码示例,展示了如何替代传统手动操作和复杂C脚本,实现周期性发送、动态修改报文内容等常见需求,帮助工程师5分钟内完成自动化配置。

weixin_30292843的博客 511

逆概率加权法(Inverse Probability Weighting, IPW)的原理及R实现

逆概率加权(IPW)是一种用于解释由于非随机选择观测值或人群信息的非随机缺失而造成的缺失和选择偏差的方法。原理:这种方法可以通过对观察值的加权来修正分析,使其具有被选中的概率。IPW是基于这样一个假设,即整个研究人群都有可以预测纳入概率(非遗漏)的个体信息,因此,在考虑到这些信息后,我们可以仅从非遗漏的观察值开始对整个目标人群进行推断。计算的程序如下:首先,我们考虑整个研究人群,用逻辑回归模型计算非失访信息的概率,其中响应是非失访,协变量是其可能的预测因素。每个受试者的权重是由预测概率的倒数给出的。然后使用

Christina 5万+

设计模式之原型模式(clone)

一、Java的数据类型分类 Java的数据类型分为两类:Primitive类型(原始类型)和引用类型。其中Primitive类型指的是8个基本类型,它们都有自己的封装类型: 主值         大小     最小值         最大值                     封装类型 boolean     1 位         -         -

y658t的专栏 1120

深入解析DDR5 RFM机制:从JESD79-5标准到硬件实现

本文深入解析了DDR5内存标准中的关键机制——RFM(Refresh Management)。文章从JESD79-5标准出发,详细阐述了RFM如何通过RAA计数器实现从被动定时到主动响应的智能刷新管理,并探讨了其硬件实现细节、命令调度挑战及系统级设计考量,为芯片设计工程师优化DDR5内存子系统性能与可靠性提供了实践指导。

fff88的博客 491

详解Java中的clone方法 -- 原型模式

Java中对象的创建 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象。那么在java语言中,有几种方式可以创建对象呢? 1 使用new操作符创建一个对象 2 使用clone方法复制一个对象 那么这两种方式有什么相同和不同呢? new操作符的本意是分

昨夜星辰的博客 17万+

如何浏览与下载全球免费的地图高分辨率(亚米级)的遥感影像?

前言 如果你想使用商业卫星的高分辨遥感影像,一般价格昂贵。我们可以使用地图平台上免费的高分辨率数据。目前数据源很多,比如说google earth、天地图、四维地球、必应地图等等。这些影像统一有一个共同点就是:RGB三波段;Web地图瓦片服务。这意味着我们可以通过瓦片服务下载影像,但下载的影像只有三个波段,分别是 一.引言 二、可使用高分辨率的地图数据源 1.Google Earth影像 2.Esri World Image 3.天地图 4.必...

锐多宝的地理空间 2万+

知识图谱开发实战:搭建上市公司知识图谱(二)

搭建上市公司知识图谱(二)学习目标1. 获取上市公司公开数据1.1 获取上市公司列表与行业信息1.2 代码展示2. 从网站爬取上市公司网页并存储为 HTML文件2.1 准备环境2.2 爬取上市公司公开信息3. 解析HTML文件,获取高管信息并存储为 csv 文件4. 设计知识图谱数据库4.1 实体4.2 关系4.3 属性4.4 特殊4.5 代码5. 知识图谱数据库查询实战5.1 实战:按照neo4j的数据格式,转换CSV文件5.2 实战:使用neo4j-admin 导入数据5.3 实战:使用neo4j-b

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 2094

23中设计模式之_原型模式(深/浅拷贝)

前言 原型模式其实java Object中已经提供了一个Clone( )方法,平时很少用到,最近读Retrofit源码时候看到有这种使用方式。 定义 原型模式就是在系统clone()标记的基础上,对Clone()进行复写,不同的操作可以产生两种拷贝模式。 UML类图 源码分析 今天我们来讲原型模式,这个模式的简单程度是仅次于单例模式和迭代器模式,非常简单,但是要使 用好这个模...

Android 工程化与移动架构实践 8033

疾风气象大模型4.0白皮书

《疾风气象大模型白皮书摘要》 疾风气象大模型(J-AFM)是国内首个基于3D建模的气象智能平台,突破传统二维气象分析的局限,采用体素化技术构建"x-y-z-t"四维统一模型,实现从分钟级短临到30天跨时效的连续预测。核心技术包括:1)多源数据三维同化,融合雷达、卫星、风廓线等异构数据;2)物理约束AI解码器,嵌入能量守恒、湍流封闭等气象原理;3)行业适配插件,服务风电、光伏、航空等领域,如山地风场尾流校正、云影短临预测。平台支持批流一体推理与边缘部署,提供概率化输出和误差溯源能力,显著降

专注AI大模型,软件混淆,授权 542

设计模式-原型模式 clone

原型模式-主要用于对象的创建非常的复杂,便捷的创建想要的对象

qq_45039595的博客 259

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

原型模式-(clone,浅克隆与深克隆)

文章目录原型模式(克隆)浅克隆原型类测试深克隆原型类深克隆实现测试 原型模式(克隆) Prototype 拷贝与复制 IO流当然也可以实现拷贝,但是效率不如在内存中实现拷贝。 问题是,Java直接操作内存是比较麻烦的,就得将这部分工作交给C/C++。关键字native。 Object类中的clone()方法,Cloneable接口。 实现方法: 实现Cloneable接口...

Tiko的博客 472

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

原型模式——clone

设计模式之禅学习——原型模式   1、原型模式非常简单,要使用原型模式时只要将被clone的类继承Cloneable接口,并重写clone()方法就可以。   2、原型模式的原理是内存二进制流的拷贝,要比直接New出一个对象快得多,性能能够得到很大提升。当我们       要产生大量一个类的对象时,这些对象只是细节上不同,这时就可以通过原型模式提高代码的效率。原型模       式一般...

赫家旺的博客 245

原型模式(Clone)

简介:原型模式是一个创建型模式,用户从这个样本对象中复制出一个内部属性一致的对象,这个过程也就是俗称的“克隆”。 定义:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 使用场景: 1.类的初始化需要消耗非常多资源,通过原型拷贝可以避免这些重复消耗。 2.通过new产生一个对象需要非常繁琐的数据准备或访问权限,这时可以使用。 3.一个对象需要提供给提供给其他对象访问,而且各

Kiven 每天都需要有所获,每天都需要进步......... 584

浅析原型模式中的clone()

更多精彩文章请访问我的个人博客(zhuoerhuobi.cn) 最近学习到设计模式中的原型模式,在学习过程中,产生了对clone()实现的原理和效率的兴趣。 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 什么是clone(),和new有什么区别 clone()方法,在内存中进行数据块的拷贝,复制已有的对象,也是生成对象的一种方式。前提是类实现Cloneable接口,Cloneable接口没有.

卓尔货币的博客 928

原型模式(clone模式)

主要用于,在大对象创建时,进行克隆,这样子就不用再初始化创建对象了!<?phpdefine('BASEDIR',__DIR__);echo "---空间命名和自动引入类文件 更进一步-----------\n";include BASEDIR."/Mooc/Loader.php";//引入一个能载入全部类的文件spl_autoload_register('\\Mooc\\Loader::au...

weixin_34161083的博客 549

原型模式

定义: 给出一个原型对象实例来指定创建对象的类型,并通过拷贝这些原型的方式来创建新的对象。 原型模式是简单程度仅次于单例模式的简单模式,它的定义可以简单理解为对象的拷贝,通过拷贝的方式创建一个已有对象的新对象,这就是原型模式。 设计类图:   在原型模式中主要的任务是实现一个接口,这个接口具有一个clone方法可以实现拷贝对象的功能,也就是上图中的ProtoType接口。由于在...

川峰的博客 3888

设计模式之原型模式(Cloneable接口、浅拷贝、深拷贝)

原型模式是23种设计模式之一,很多类的拷贝都使用到了此模式。 例如Spring框架中bean的作用域prototype模式。 意义:当我们想要去复制一个对象的时候,使用原型模式,就可以无需知道该对象的内部细,快速高效的去拷贝出一个对象。 类型:创建型模式

四维大脑的博客 663

设计模型之原型模型与cloneable接口(深度克隆与浅度克隆区别)

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33756418的博客 342

设计模式之原型模式

原型模式 前言 原型模式属于对象的创建模式。通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象。这就是选型模式的用意。 克隆羊问题: 现在有一只羊tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和tom 羊 属性完全相同的10只羊。 传统方式解决克隆羊问题: /** * @author 孙一鸣 on 2020/2/6...

俺老孙来也 430

原型模式--初步探究clone方法

clone方法 有个User类, 拥有字段String类型的name和Date类型的date, 有参构造,无参构造,重写toString方法,实现Cloneable接口,并重写clone方法 public class User implements Cloneable { private String name; private Date date; public Us...

qq_40306697的博客 214

【大话设计模式】模式四:原型模式与浅谈Cloneable浅复制、深复制

一、原型模式 原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 原型模式(Prototype)结构图 : Prototype原型类,声明一个克隆自身的接口。 ConcretePrototype具体原型类,实现一个克隆自身的接口。 【代码实现】: Prototype类 public abstract class Prototype { private String id; public Prototype(Stri.

m0_46013789的博客 1110

原型模式(cloneable接口实现)

原型模式 使用cloneable接口实现原型模式,包括浅复制、深复制 ******************************************** 相关接口 Cloneable public interface Cloneable { } 说明:该接口只是一个标识接口,表明类可被复制,具体实现在Object类中 *************...

weixin_43931625的博客 808

由原型模式引出的关于Cloneable接口和Object的clone()方法的一些问题

为什么要克隆快速到底 示例代码 1 class Resume 2 { 3 private String name; 4 private String age; 5 private String university; 6 private String specialSkills; 7 8 public...

weixin_30621959的博客 244
上一篇: 建造者模式
下一篇: UML类图
code_Floyed
博客等级 码龄7年 3粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值