设计模式之原型模式

23种设计模式-原型(Prototype)设计模式 软考中级-软件设计师 原型模式 阅读详情

原型模式基本介绍

在这里插入图片描述

原型模式-原理结构图

在这里插入图片描述

原理结构图说明
1、Prototype:原型类,声明一个克隆自己的接口。
2、ConcretePrototype:具体的原型类,实现一个克隆自己的操作。
3、client:让一个原型对象克隆自己,从而创建一个新的对象(属性一样)

原型模式-代码实现

1、创建实体类,实现cloneable接口,重写clone方法。

package prototype;

/**
 * @Date 2020/5/23 下午4:19
 * @Created by zhaoli
 */
public class Sheep implements Cloneable{
    private String name;
    private Integer age;
    private String color;

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

    public Sheep() {
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

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

    @Override
    protected Object clone(){
        Sheep sheep = null;
        try {
            sheep = (Sheep) super.clone();
            System.out.println(sheep);
        } catch (CloneNotSupportedException e) {
            System.out.println(e.getMessage());
        }
        return sheep;
    }
}

2、客户端

package prototype;

/**
 * @Date 2020/5/23 下午4:23
 * @Created by zhaoli
 */
public class Client {
    public static void main(String[] args) {
        System.out.println("==========使用原型模式对对象进行克隆==========");
        Sheep sheep = new Sheep("doli",1,"white");
        Sheep sheep1 = (Sheep) sheep.clone();
        Sheep sheep2 = (Sheep) sheep.clone();
        Sheep sheep3 = (Sheep) sheep.clone();
        Sheep sheep4 = (Sheep) sheep.clone();
        System.out.println("sheep:"+sheep.hashCode());
        System.out.println("sheep1:"+sheep1.hashCode()) ;
        System.out.println("sheep2:"+sheep2.hashCode());
    }
}

3、运行结果
在这里插入图片描述

深入讨论-深拷贝 浅拷贝

浅拷贝介绍
1)对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。
2)对于数据类型是引用类型的成员变量,比如成员变量是某个数组,某个类的对象等,那么浅拷贝会进行引用传递,也就是将该成员变量的引用值(内存地址)复制一份给新的对象。实际上两个对象的该成员变量都指向同一个实例。在这种情况下,在一个对象中修改该成员变量会影响到另一个对象该成员变量的值。
3)浅拷贝是使用默认的clone()方法来实现。
sleep = (Sleep)super.clone();

package prototype;

/**
 * @Date 2020/5/23 下午4:19
 * @Created by zhaoli
 */
public class Sheep implements Cloneable{
    private String name;
    private Integer age;
    private String color;
    //引用类型
    private Address address;

    public Sheep(String name, Integer age, String color, Address address) {
        this.name = name;
        this.age = age;
        this.color = color;
        this.address = address;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public Sheep() {
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public String toString() {
        return "Sheep{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", color='" + color + '\'' +
                ", address=" + address +
                '}';
    }

    @Override
    protected Object clone(){
        Sheep sheep = null;
        try {
            sheep = (Sheep) super.clone();
        } catch (CloneNotSupportedException e) {
            System.out.println(e.getMessage());
        }
        return sheep;
    }
}

class Address{
    private String address;

    public Address(String address) {
        this.address = address;
    }

    public Address() {
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Address{" +
                "address='" + address + '\'' +
                '}';
    }
}
package prototype;

/**
 * @Date 2020/5/23 下午4:23
 * @Created by zhaoli
 */
public class Client {
    public static void main(String[] args) {
        System.out.println("==========使用原型模式对对象进行克隆==========");
        Sheep sheep = new Sheep("doli",1,"white",new Address("晋中"));
        Sheep sheep1 = (Sheep) sheep.clone();
        Sheep sheep2 = (Sheep) sheep.clone();
        Sheep sheep3 = (Sheep) sheep.clone();
        Sheep sheep4 = (Sheep) sheep.clone();
        System.out.println("sheep:"+sheep.hashCode());
        System.out.println("sheep1:"+sheep1.hashCode()) ;
        System.out.println("sheep2:"+sheep2.hashCode());

        System.out.println(sheep1.getName().hashCode());
        System.out.println(sheep2.getName().hashCode());

        System.out.println("sheep:"+sheep.getAddress().hashCode());
        System.out.println("sheep1:"+sheep1.getAddress().hashCode());
        System.out.println("sheep2:"+sheep2.getAddress().hashCode());


    }
}

运行结果
在这里插入图片描述
分析结果可以得出
sheep1和sheep2是不同的对象,但是三个sheep里面的address指向的是同一个内存地址,因为hashcode值相同。

深拷贝
创建一个新对象,然后将当前对象的非静态字段复制到该新对象,无论该字段是值类型的还是引用类型,都复制独立的一份。当你修改其中一个对象的任何内容时,都不会影响另一个对象的内容。

那么如何实现深拷贝?

深拷贝的原理我们知道了,就是要让原始对象和克隆之后的对象所具有的引用类型属性不是指向同一块堆内存,这里有三种实现思路。 
①、让每个引用类型属性内部都重写clone() 方法

既然引用类型不能实现深拷贝,那么我们将每个引用类型都拆分为基本类型,分别进行浅拷贝。比如上面的例子,Sheep 类有一个引用类型 Address(其实String 也是引用类型,但是String类型有点特殊,后面会详细讲解),我们在 Address 类内部也重写 clone 方法。如下:

package prototype;

/**
 * @Date 2020/5/23 下午4:19
 * @Created by zhaoli
 */
public class Sheep implements Cloneable{
    private String name;
    private Integer age;
    private String color;
    //引用类型
    private Address address;

    public Sheep(String name, Integer age, String color, Address address) {
        this.name = name;
        this.age = age;
        this.color = color;
        this.address = address;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public Sheep() {
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    @Override
    public String toString() {
        return "Sheep{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", color='" + color + '\'' +
                ", address=" + address +
                '}';
    }

    @Override
    protected Object clone(){
        Sheep sheep = null;
        try {
            sheep = (Sheep) super.clone();
            sheep.address = (Address) address.clone();
        } catch (CloneNotSupportedException e) {
            System.out.println(e.getMessage());
        }
        return sheep;
    }
}

class Address implements Cloneable{
    private String address;

    public Address(String address) {
        this.address = address;
    }

    public Address() {
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Address{" +
                "address='" + address + '\'' +
                '}';
    }

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

再次运行主类
在这里插入图片描述
可以看到这时候address内存地址是不同的,这时候我们就实现了深拷贝。但是这种方式存在一个问题,如果address还有一个引用对象,那么要实现深拷贝,那么我们也要重写其clone 方法,这样下去,有多少个引用类型,我们就要重写多少次,如果存在很多引用类型,那么代码量显然会很大,所以这种方法不太合适。
②、利用序列化

序列化是将对象写到流中便于传输,而反序列化则是把对象从流中读取出来。这里写到流中的对象则是原始对象的一个拷贝,因为原始对象还存在 JVM 中,所以我们可以利用对象的序列化产生克隆对象,然后通过反序列化获取这个对象。

注意每个需要序列化的类都要实现 Serializable 接口,如果有某个属性不需要序列化,可以将其声明为 transient,即将其排除在克隆属性之外。

package prototype;

import java.io.*;

/**
 * @Date 2020/5/23 下午4:23
 * @Created by zhaoli
 */
public class Client {
    public static void main(String[] args) throws IOException, ClassNotFoundException {

        FileOutputStream fos = new FileOutputStream("t.tmp");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        oos.writeObject(new Sheep("doli",1,"white",new Address("晋中")));

        new Thread(()->{
            FileInputStream fis = null;
            try {
                fis = new FileInputStream("t.tmp");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            ObjectInputStream ois = null;
            try {
                ois = new ObjectInputStream(fis);
            } catch (IOException e) {
                e.printStackTrace();
            }
            Sheep sheep = null;
            try {
                sheep = (Sheep) ois.readObject();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            //Sheep sheep2 = (Sheep) ois.readObject();


            System.out.println("sheep:"+sheep) ;
            System.out.println("sheep.hashcode:"+sheep.hashCode());

            System.out.println("sheep address:"+sheep.getAddress().hashCode());
        }).start();

        new Thread(()->{
            FileInputStream fis = null;
            try {
                fis = new FileInputStream("t.tmp");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            ObjectInputStream ois = null;
            try {
                ois = new ObjectInputStream(fis);
            } catch (IOException e) {
                e.printStackTrace();
            }
            Sheep sheep = null;
            try {
                sheep = (Sheep) ois.readObject();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
            System.out.println("sheep1:"+sheep) ;
            System.out.println("sheep1.hashcode:"+sheep.hashCode());

            System.out.println("sheep1 address:"+sheep.getAddress().hashCode());
        }).start();


    }
}

运行结果
在这里插入图片描述
可以看到两个线程跑出来的对象是不同的。

C++设计模式——Prototype Pattern原型模式 原型模式是一种创建型设计模式,它允许通过克隆已有对象来创建新对象,从而无需调用显式的实例化过程。原型模式的设计,使得它可以创建一个与原型对象相同或类似的新对象,同时又可以减少对象实例化操作产生的性能开销,使得创建对象的操作更加便捷,它减少了大量不必要的重复工作,并提高了系统性能。当创建对象的操作比较复杂和耗时的时候,原型模式则提供了一个更加高效和简单的创建对象的模式,它可以更加快速的创建对象的副本,且不需要依赖对象的某些实例化步骤,它避免了使用传统的new关键字创建对象实例时的复杂构造过程。 阅读详情

相关推荐

CANOCO5.0实现冗余分析(RDA)最详细步骤

在地理及生态领域会常使用RDA分析,RDA的实现路径也有很多,今天介绍一下CANOCO软件的实现方法。1.不同样点和环境因子之间夹角是锐角 是正相关,是钝角是负相关。2.夹角越大 说明相关性较小,夹角越小,相关性越大。得有不同的物种或者样点数值,再加上环境因子数据。3.箭头越长 相关性越大。时间调整到2010年。

Along6的博客 1万+

18 原型模式(原型设计模式)详解

创建型模式: 单例(Singleton)模式、原型(Prototype)模式、工厂方法(Factory Method)模式、抽象工厂(Abstract Factory)模式和建造者(Builder)模式 在有些系统中,存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂且耗时耗资源,用原型模式生成对象就很高效,就像孙悟空拔下猴毛轻轻一吹就变出很多孙悟空一样简单。 原型模式的定义与特点 原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象.

天道·乾坤 的博客 926

2026年4月AI爆发周:阿里连推三款模型、字节全双工语音上线,国内大模型进入“落地竞速“新阶段

**摘要:**2026年4月初,国内AI大模型迎来密集发布,阿里、字节、腾讯分别推出新产品。阿里一周发布三款模型,覆盖通用推理、多模态轻量化和长文档处理,API价格大幅下降;字节推出全双工语音模型,实现实时交互,技术难度高;腾讯混元3.0强调工程化和生态整合,面向企业私有化部署。趋势显示,行业从性能竞赛转向落地竞赛,多模态成为主战场,API成本降低,开发者选择更丰富。国内大模型竞争重点转向实际应用和生态整合。

weixin_45526015的博客 1万+

一篇文章彻底搞懂原型和原型链(图解+代码)

JavaScript 规定,每一个构造函数都有一个 prototype(原型) 属性,指向另一个对象,所以我们也称为原型对象,构造函数通过原型分配的函数是所有对象所共享的。

有事儿私信。 1947

使用 C# 实现大华监控摄像头的控制与数据处理

本文介绍了使用C#调用大华SDK(DHNetSDK.dll)开发监控系统的方法。主要内容包括:开发准备、DLL引用设置、SDK初始化与设备登录、视频预览窗口嵌入、云台控制、抓图录像等核心功能实现。通过P/Invoke技术封装SDK接口,开发者可以快速构建具有视频监控、设备控制功能的C#应用程序。文中还提供了代码示例、常见问题解决方案,以及视频帧智能分析的扩展建议,为开发大华监控系统的二次应用提供了完整的技术指南。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1275

手把手教你用DLP4500和海康相机搭建双目结构光系统(附完整代码获取路径)

本文详细介绍了如何利用DLP4500投影仪和海康工业相机搭建低成本双目结构光三维测量系统。从硬件选型、软件配置到结构光编码解码实现,再到三维重建全流程,提供了完整的实战指南和优化技巧,帮助用户以不到2万元的预算实现0.05mm精度的三维扫描。

weixin_32447969的博客 316

Java原型模式

原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节 原型模式的结构与实现 由于Java提供了对象的 clone() 方法,所以用 Java 实现原型模式很简单。 1. 模式的结构 原型模式包含以下主要角色。...

weixin_30710457的博客 398

使用DevExpress22.X(Patch)控件库在VisualStudio2022使用C#进行Winform、WPF应用的开发,看这一篇就够了!

写在开头,Dev Express是个十分强大的控件库(下文简称Dev),但碍于其高昂的使用费用,“出于学习目的”,我们一般使用的都是Patch版本(在版权意识日趋加强的当下,不要提那两个字,现在加上那些字,百度都搜不出内容)。

平凡之路 2万+

设计模式—— 十三 :原型模式

文章目录什么是原型模式?个性化电子账单使用原型模式前使用原型模式后原型模式的优缺点原型模式的优点原型模式的缺点深克隆与浅克隆浅克隆深克隆原型模式的应用场景 什么是原型模式? 原型模式是一个比较简单,但应用频率比较高的设计模式。 Specify the kinds of objects to create using a prototypical instance,and create new objects by copying this prototype.(用原型实例指定创建对象的种类,并且通过拷贝

三分恶的博客 1461

全面指南:PyTorch与ROCm版本兼容性及多版本环境管理

本文详细介绍了在AMD GPU上配置PyTorch开发环境的完整流程,重点解决版本兼容性和多版本ROCm环境管理问题。主要内容包括:1) PyTorch与ROCm版本对应关系查询;2) 四种查看ROCm版本的方法;3) 使用update-alternatives管理多版本ROCm;4) 环境变量配置与冲突解决方案;5) 完整的验证流程和性能测试方法。文章提供了最佳实践建议和故障排除清单,帮助开发者快速搭建稳定高效的深度学习开发环境,充分发挥AMD GPU硬件性能。通过系统化的验证流程确保各组件协同工作,解决

数字人生 606

图像处理:张量分解在图像处理领域的应用

随着计算机视觉和图像处理技术的快速发展,图像数据呈现出高维、多模态、海量等特点。传统的矩阵分解方法已经无法有效处理这些复杂的图像数据。张量分解作为一种高阶矩阵分解方法,可以很好地捕捉图像数据的高维结构信息,在图像处理领域展现出巨大的应用前景。本节介绍几种常用的张量分解算法,包括高阶SVD(HOSVD)、Tucker-ALS、CP-ALS等。这些算法的核心思想是通过迭代优化的方式,交替更新张量分解的因子矩阵,直到收敛为止。综上所述,本文系统地介绍了张量分解技术在图像处理领域的应用。

AI天才研究院 7103

设计模式-原型模式 Prototype Pattern

通常,如果需要快速复制对象并且对象的创建成本较高,或者需要创建多个相似但不完全相同的对象,原型模式是一个更好的选择。原型模式(Prototype Pattern)是一种创建型设计模式,它允许你通过复制现有的对象来创建新的实例,而不是通过新建的方式来构造。使用原型模式可以提高对象创建的效率,降低系统的资源消耗,并有助于实现对象的快速复制和灵活管理。然而,需要注意的是,原型模式可能会增加内存消耗,并且在处理包含引用类型成员的对象时需要特别小心,以避免浅拷贝导致的问题。

wesigj的博客 1699

python基础:工作会用到的90%的python代码都在这了(万字详解!)

Python 备忘单是 Python 3 编程语言的单页参考表 著名的“Hello World”程序在 Python 中的实现 Python 不能在没有赋值的情况下声明变量 变量可以存放不同类型的值 内置数据类型 序列指一批有序的元素,集合指一批无序且不重复的元素查看: 数据类型 查看: 字符串 查看: 列表 查看: 判断 查看: 循环 查看: 函数 查看: 文件处理 表示 x 和 y 的商, 表示 x 和 y 的底商,另见 StackOverflow f-字符串 (Python 3.6+) 查看

数据知道的博客 1万+

23种设计模式之原型模式(Prototype Pattern)

本篇文章将23种设计模式中的单例设计模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

设计模式|原型模式(Prototype Pattern)

原型模式(Prototype Pattern)是一种创建型设计模式,其核心思想是通过复制现有对象来创建新对象,而无需显式地指定它们的类。这种模式通常用于当对象的创建成本较高,或者对象初始化过程比较复杂时。

weixin_44435110的博客 1420

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++设计模式——原型模式(Prototype Pattern)

C++设计模式——原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——原型模式(Prototype Pattern)目录定义代码示例普通指针方式实现智能指针方式实现总结为什么需要原型模式优缺点 定义 Specify the kinds of Objects to create using a prototypical instance, and create new objects by copying this prototype. 用原型实例指

leonardohaig的博客 1636

23种设计模式——原型模式 (Prototype Pattern)详解

本文介绍了23种经典设计模式之——原型模式 (Prototype Pattern)的说明及使用

Meteors.的博客 1001

设计模式之原型模式(Prototype Pattern)

意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。主要解决:在运行期建立和删除原型。何时使用:1、当一个系统应该独立于它的产品创建,构成和表示时。2、当要实例化的类是在运行时刻指定时,例如,通过动态装载。3、为了避免创建一个与产品类层次平行的工厂类层次时。4、当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。如何解决:利用已有的一个原型对象,快速地生成和原型对象一样的实例。

weixin_42294716的博客 859

【设计模式】原型模式(Prototype Pattern)详解

摘要: 原型模式通过复制已有对象(原型)来创建新对象,避免重复初始化带来的性能开销。核心思想是“拷贝”而非重新构造,适用于创建成本高、对象差异小的场景。Java通过Cloneable接口支持原型模式,但需注意浅拷贝(仅复制对象本身)与深拷贝(复制对象及引用对象)的区别。优点包括提高性能、简化创建过程,缺点在于实现复杂且可能破坏封装性。典型应用包括Spring的prototype作用域、游戏角色复制等。使用时应权衡对象创建成本,避免过度设计。

经天纬地,格物致理 922

设计模式六:原型模式(Prototype Pattern)

原型模式是一种创建对象的设计模式。它允许我们通过复制一个现有对象来创建新的对象,而无需知道其具体实现细节。在使用原型模式时,我们首先创建一个原始对象,然后根据需要复制该对象,以获得新创建的对象。原型模式的主要思想是基于对象的复制。通过使用原型模式,我们可以避免直接实例化对象,从而提高性能和代码灵活性。此外,原型模式还可以用于创建复杂的对象结构,因为它允许我们在创建对象时使用已经存在的对象作为蓝图。

qq_40537587的博客 834

彻底搞懂设计模式DesignPattern-原型模式

原型模式 原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型, 创建新的对象 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,无需知道如何创建的细节 工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建,即 对象.clone() 被复制的实例就是我们所称的“原型”,这个原型是可定制的。原型模式多用于创建复杂的或者构造耗时的实例,因为这种情况下,复制一个已经存在的实例可使程序运行更高

Ping 467

Java设计模式——原型模式【ProtoType Pattern】

Java设计模式、原型模式

scorpio的博客 495

C++ 设计模式:原型模式(Prototype Pattern)

C++ 设计模式:原型模式(Prototype Pattern)

冀晓武的博客 1552

Java设计模式 六 原型模式 (Prototype Pattern)

原型模式是解决对象重复创建问题的强大工具,特别适合那些创建成本高或需要快速生成对象的场景。根据具体需求,可以选择浅拷贝或深拷贝的实现方式。尽管实现上可能会稍复杂,但它提供了灵活性和高效性,是值得掌握的重要设计模式之一。

空 1117

Java 设计模式——原型模式(Prototype Pattern)

Java 设计模式——原型模式(Prototype Pattern) 一.基础概念 1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 2.主要概念 Java中的克隆方法: 浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝 深拷贝:对基本数据类型进行值传递,对引用数据类型,创建一个新的对象,并复制其内容,此为深拷贝 二: 具体实现 1.浅...

a158s168的博客 457

设计模式总结之Prototype Pattern(原型模式)

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

cooldragon的专栏 5964
上一篇: 设计模式之抽象工厂模式
下一篇: 二叉搜索树的后序遍历序列(三十四)
software_Manito
博客等级 码龄8年 6粉丝 90原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值