设计模式学习(二)——创建型模式(单例、工厂、建造者)

设计模式1-创建型模式(工厂方法模式,建造者模式,单例模式) 一、简单工厂模式 获取一个对象同一个工厂创建,而我不需要知道创建的细节,比如: public class staticFactory{ /** *简单工厂模式 **/ public static Fruite getFruite(int type){ if(type_apple = type){ return new Apply(); }else if(ty... 阅读详情

单例模式

单例模式:保证一个类仅有一个实例,并且这个类提供一个全局的访问接口,某些对象在全局只需要一个,就可以使用单例模式。

单例模式的创建可以分为两种模式:提前加载和延迟加载。

提前加载模式:

    public class Singleton {
        
        private static Singleton instance = new Singleton();
        private Singleton(){}
        
        public static Singleton getInstance(){
            return instance;
        }
    }

也叫饿汉式,它通过静态变量实现了全局只保证存在一个实例,保证了线程安全。但是,这种方式有一个明显的缺点,如果在程序某一次执行时一直没有用到这个实例,那就造成了资源的浪费,同时,使用全局变量也使程序变得难以调试与维护。

枚举方式:

public enum Singleton {
	 //定义一个枚举的元素,它就是 Singleton 的一个实例
    INSTANCE;  
    
    public void doSomething(){}
}

//使用方法
public class Test {

	public static void main(String[] args) {
		Singleton singleton = Singleton.INSTANCE;
		singleton.doSomething();

	}
}

延迟加载:

public class Singleton {  

      private static Singleton instance;  
      private Singleton (){ }   

      public static Singleton getInstance() {
          //判断当前单例是否已经存在,若存在则返回,不存在则再建立单例
	      if (instance == null) {  
              // 1
	          instance = new Singleton();  
	      }  
	      return instance;  
      }  
 }

上面创建单例是存在问题的,当一个线程走到 1 是,尚未来得及创建出对象,另一个线程也走到 1,就会打破单例,创建出多个对象。要解决线程安全问题,我们可以给 getInstance() 这个方法加一个 synchronized 关键字,或者 使用 synchronized() 修饰这段代码块,具体如下:

// 1.
public class Singleton {  

      private static Singleton instance;  
      private Singleton (){ }   

      public static synchronized Singleton getInstance() {
      
	      if (instance == null) {  
	          instance = new Singleton();  
	      }  
	      return instance;  
      }  
 }
// 2.
public class Singleton {  

      private static Singleton instance;  
      private Singleton (){ }   

      public static Singleton getInstance() {
      
      	synchronized(this) {
      		if (instance == null) {  
	          	instance = new Singleton();  
	      	}  
      	} 
      	return instance;
      }  
 }

这样,我们就解决了线程安全的问题。但这样又会出现一个问题,每次调用 getInstance() 都会经过加锁这一层,会带来很多不必要的时间消耗,所以,我们在锁外在进行一次判断就会大大节省开支:

public class Singleton {  

      private volatile static Singleton instance;  
      private Singleton (){ }   

      public static Singleton getInstance() {
      	if (instance == null) {
      		synchronized(this) {
      			if (instance == null) {  
	          		instance = new Singleton();  
	      		}  
      		} 
      	}
      	return instance;
      }  
 }

这里,我们还加了 volatile 关键字来保证 对象在创建时,多线程对其的正确处理。这样,已经完全可以确保线程安全了。

工厂模式

简单工厂模式:

也叫静态工厂模式,客户传入不同的参数,就可以得到不同的对象。

// 产品接口:手机是产品,里面有个方法可以展示操作系统
public interface Phone {
    
    void showSystem();
    
}

// 具体产品 Android or iOS
public class AndroidPhone implements Phone{
    @Override
    public void showSystem() {
        System.out.println("我是Android系统");
    }
}

public class iOSPhone implements Phone{
    @Override
    public void showSystem() {
        System.out.println("我是iOS系统");
    }
}

// 工厂负责按需造手机
public class PhoneFactory {

    public static Phone create(String phone){

        Phone mPhone;

        switch (phone){

            case "Android":
                mPhone = new AndroidPhone();
                break;
            case "iOS":
                mPhone = new iOSPhone();
                break;
            default:
                throw new IllegalStateException("Unexpected value: " + phone);
        }
        return mPhone;
    }

}

// 客户就可以得到想要的手机了
public class Customer {

    @Test
    public void test(){

        // 来个Android的
        Phone Android = PhoneFactory.create("Android");
        Android.showSystem();

    }
}

工厂方法模式:

是简单工厂模式的进一步深化,我们不再提供统一的工厂去创建对象,在工厂方法模式中,工厂类被抽象化,继而由它的子类去实现对象的实例化。这样我们在扩展工厂时就不会破坏开闭原则。

//工厂接口
public interface PhoneFactory {

      Phone create();

}

//工厂具体
public class AndroidFactory implements PhoneFactory{
    @Override
    public Phone create() {
        return new AndroidPhone();
    }
}

public class iOSFactory implements PhoneFactory{
    @Override
    public Phone create() {
        return new iOSPhone();
    }
}

//客户
public class Customer {

    @Test
    public void test(){

        // 来一个Android的
        AndroidFactory androidFactory = new AndroidFactory();
        Phone android = androidFactory.create();
        android.showSystem();
    }
}

随着国产手机操作系统的崛起,我们是时候扩展扩展我们的工厂了:

//新增手机
public class HarmonyPhone implements Phone{

    @Override
    public void showSystem() {
        System.out.println("我是鸿蒙的");
    }
}

//新增工厂
public class HarmonyOSFactory implements PhoneFactory{
    @Override
    public Phone create() {
        return new HarmonyPhone();
    }
}

//客户
public class Customer {

    @Test
    public void test(){

        // 来一个Android的
        AndroidFactory androidFactory = new AndroidFactory();
        Phone android = androidFactory.create();
        android.showSystem();

        // 来个鸿蒙的
        HarmonyOSFactory harmonyOSFactory = new HarmonyOSFactory();
        Phone harmony = harmonyOSFactory.create();
        harmony.showSystem();
    }
}

这就是工厂方法模式。但是随着我们产品的增多,代码量巨增。

抽象工厂模式:

抽象工厂模式又是工厂方法模式的扩展版,它不再创建一个单一的对象,而是创建一系列相关的对象。

继续拿上面的例子来说,手机除了操作系统,还分国产和进口。

//国产Android手机
public class ChinaAndroid implements AndroidPhone{
    @Override
    public void showSystem() {
        System.out.println("国产Android");
    }
}

//国产iOS手机
public class ChinaIOS implements iOSPhone{
    @Override
    public void showSystem() {
        System.out.println("国产iOS");
    }
}

//进口Android手机
public class ImportAndroid implements AndroidPhone{
    @Override
    public void showSystem() {
        System.out.println("进口Android");
    }
}

//进口iOS手机
public class ImportIOS implements iOSPhone{
    @Override
    public void showSystem() {
        System.out.println("进口iOS");
    }
}

//国产工厂
public class ChinaFactory implements PhoneFactory{
    @Override
    public AndroidPhone createAndroid() {
        return new ChinaAndroid();
    }

    @Override
    public iOSPhone createiOS() {
        return new ChinaIOS();
    }
}

//进口工厂
public class ImportFactory implements PhoneFactory{
    @Override
    public AndroidPhone createAndroid() {
        return new ImportAndroid();
    }

    @Override
    public iOSPhone createiOS() {
        return new ImportIOS();
    }
}

//客户
public class Customer {

    @Test
    public void test(){
        // 国产工厂
        PhoneFactory chinaFactory = new ChinaFactory();
        AndroidPhone androidPhone = chinaFactory.createAndroid();
        iOSPhone iOSPhone = chinaFactory.createiOS();
        androidPhone.showSystem();
        iOSPhone.showSystem();

    }
}

OK,这就是抽象工厂模式。

介绍到这里,我们发现三种不同的方式存在着很多重叠的地方,而且,设计模式并不存在着明确的定义,关键在于要了解其中的核心思想。工厂模式的核心概念就是利用工厂来创建对象,而不应该将对象的创建交给一个和此对象无关的类,就上面例子而言,难道客户还要负责去自己造出一个手机吗?

建造者模式

正常的建造者模式

建造者模式允许用户在不知道内部构造的情况下,一步步精细控制对象的构造流程来创造出一个复杂对象。当我们构建不同的对象时,可以通过构造不同的建造者来进行实例化。

建造者包含以下类:

  • Product(产品类):这是需要为它构建的类。
  • Builder(抽象建造者类):用于声明需要构建产品的组成部分。
  • ConcreteBuilder(具体建造者):实现抽象建造者中声明的方法。
  • Director(指挥者):指导如何构建对象的类。

举个例子,构建一个程序员?

//产品类
public class Programmer {

    private int age;

    private String language;

    private int salary;

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

    public void setLanguage(String language) {
        this.language = language;
    }

    public void setSalary(int salary) {
        this.salary = salary;
    }

    public int getAge() {
        return age;
    }

    public int getSalary() {
        return salary;
    }

    public String getLanguage() {
        return language;
    }
}

//抽象构建者
abstract class Builder {

    abstract void buildAge();

    abstract void buildSalary();

    abstract void buildlanguage();

}

//具体构建者
public class ConcreteBuilder extends Builder{

    Programmer programmer = new Programmer();

    @Override
    void buildAge() {
       programmer.setAge(25);
    }

    @Override
    void buildSalary() {
        programmer.setSalary(20000);
    }

    @Override
    void buildlanguage() {
        programmer.setLanguage("Java");
    }
}

//指导类
public class Director {

    public void construct(Builder builder){
        builder.buildAge();
        builder.buildSalary();
        builder.buildlanguage();
    }

}

//Boss
public class Boss {

    @Test
    public void test(){
        Director director = new Director();
        ConcreteBuilder concreteBuilder = new ConcreteBuilder();
        director.construct(concreteBuilder);
        Programmer programmer = concreteBuilder.programmer;
        System.out.println("age: " + programmer.getAge() + "\n" +
                            "salary: " + programmer.getSalary() + "\n" +
                            "language: " + programmer.getLanguage());

    }

}

拥有方法链的匿名建造者:

我们再举一个例子

public class Computer {
    protected String mBoard;
    protected String mDisplay;
    protected String mCpu;
    protected String mGpu;
    protected String mOs;

    public void setBoard(String board) {
        mBoard = board;
    }

    public void setDisplay(String display) {
        mDisplay = display;
    }

    public void setCpu(String cpu) {
        mCpu = cpu;
    }

    public void setGpu(String gpu) {
        mGpu = gpu;
    }

    public void setOs(String os) {
        mOs = os;
    }

    public static class Builder {
        Computer computer;

        public Builder() {
            computer = new Computer();
        }

        public Builder board(String board) {
            computer.setBoard(board);
            return this;
        }

        public Builder display(String display) {
            computer.setDisplay(display);
            return this;
        }

        public Builder cpu(String cpu) {
            computer.setCpu(cpu);
            return this;
        }

        public Builder gpu(String gpu) {
            computer.setGpu(gpu);
            return this;
        }

        public Builder os(String os) {
            computer.setOs(os);
            return this;
        }

        public Computer build() {
            return computer;
        }
    }
}

//使用方法
public void compyter(){

    Computer computer = new Computer.Builder()
                        .board("")
                        .display("")
                        .cpu("")
                        .gpu("")
                        .os("")
                        .build();
    }

工厂模式是将对象的全部创建过程封装在工厂类中,由工厂类向客户端提供最终的产品;而建造者模式中,建造者类一般只提供产品类中各个组件的建造,而将具体建造过程交付给导演类。由导演类负责将各个组件按照特定的规则组建为产品,然后将组建好的产品交付给客户端。

创建型模式还有原型模式和对象池模式,有时间我们再继续探究。

参考:《Java设计模式及实践》

史上最全的是适合理解的设计模式教程(创建型模式) 单例模式是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。数据库的连接池不会反复创建spring中一个单例模式bean的生成和使用在我们平常的代码中需要设置全局的的一些属性保存/** @description 静态类单例模式* @author 罗添煦* @create 2024-08-20 下午2:51*/// 私有构造函数,防止外部通过new创建实例// 静态内部类,含有单一实例// 公有静态方法,返回唯一的实例@Test。 阅读详情

相关推荐

【从零开始学习计算机科学】设计模式(二)工厂模式、抽象工厂模式、单例模式、建造者模型、原型模式

原型模式是一种创建型设计模式,它通过复制现有的对象来创建新的对象,而不是通过实例化来创建。这种模式的核心思想是:如果一个对象的创建成本较高或者重复创建同样类型的对象会浪费资源时,可以通过复制现有对象来获得新的实例。建造者模式是一种创建型设计模式,它将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。通过建造者模式,客户端可以不关心对象的创建过程,只需提供所需的参数,而让建造者类来负责具体的构建逻辑。它控制类的实例化过程,避免了多个实例的创建,保证了类的实例在整个生命周期内是唯一的。

AI科研社 1192

设计模式之创建型模式(简单工厂模式、工厂模式、抽象工厂模式、建造者模式、单例模式)

一、设计模式的分类 1、创建型模式 共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

CarmenIsOK的博客 580

Simulink实战:火电机组一次调频与AGC协同控制建模与仿真解析

本文详细解析了如何使用Simulink进行火电机组一次调频与AGC协调控制的建模与仿真。通过系统架构设计、参数设置和模块实现,阐述了如何实现两者的协同控制,确保电网频率稳定。文章提供了实用的建模技巧、参数整定经验和性能评估方法,为电力系统仿真工程师提供了有价值的实践指导。

c7d8e9的博客 310

工厂模式与建造者模式

工厂模式和建造者模式都属于创建型模式,它对类的实例化进行了抽象,能够使软件模块做到与对象的创建和组织无关。简单工厂模式专门定义一个类来负责创建其他类的实例,通常根据自变量的不同而返回不同的类的实例。工厂类 public class MoblieFactor{ public Mobile getMobile(String title) { if(title.equals("noki...

新新新的博客丶 2565

【理解机器学习算法】之Clustering算法(Agglomerative Clustering)

是一种层次聚类算法,通过逐步合并或“聚集”它们来构建嵌套聚类。这种方法采用自底向上的方式构建聚类层次:它从将每个数据点作为单个聚类开始,然后迭代合并最接近的聚类对,直到所有数据点合并为一个聚类,或直到达到指定的聚类数量。优点:- 聚合聚类在距离和连接准则的选择上具有多样性,使其适用于各种数据集。- 它产生了一个层次结构,这对于不同规模的聚类数据结构是有信息量的。-缺点:- 对于大数据集来说,它可能计算成本高,因为它需要在每次迭代中计算和更新所有聚类对之间的距离。

Hyman Qiu 2689

四、ARDUINO UNO开发板介绍

(一)ARDUINO UNO开发板 Arduino生态中包括多种开发板、模块、扩展板。其中UNO R3是最适合入门且功能齐全使用量最多的Arduino开发板。以下就是Arduino UNO R3开发板的图片。 (二)ARDUINO UNO开发板基本构成 Arduino开发板设计得非常简洁,一块AVR单片机、一个晶振或振荡器和一个5V的直流电源。常见的开发板通过一条USB数据线连接计算机。Arduino有各式各样的开发板,其中最通用的是Ardui...

简时刻的博客 7万+

Java设计模式之创建者模式

[]Java设计模式之创建型模式 1 简介 在最近看的一篇文章中,提到了关于新年目标制定的方式的实践,觉得不错,附在上图。尤其是目标一定要符合SMART模式, 为了…,通过…,截止…前,实现… 这个句式很有力量。 在日常编程实践中,对象的构建和初始化占据着十分重要的作用,在23种设计模式中,如下图所示,关于对象创建的设计模式为创建型设计模式,创建型模式主要用来解决对象的创建问题的。当然,这样的...

不当初 783

ESP32S3与ILI9341 LCD屏LVGL移植实战:从零构建嵌入式GUI界面

本文详细介绍了如何在ESP32S3平台上移植LVGL图形库并驱动ILI9341 LCD屏幕,从硬件选型、开发环境配置到显示驱动实现和内存优化。通过实战案例讲解移植过程中的关键步骤和常见问题解决方案,帮助开发者快速构建嵌入式GUI界面。

h9j8k7l6m5n的博客 1098

2.5万字详解23种设计模式—创建型模式(简单工厂、工厂方法、抽象工厂、单例-多线程安全详解、建造者、原型)的详细解读、UML类图、及代码演示

经学习于多位网上大佬并结合自己的感悟和理解,本文简述了各大设计模式,并通过UML和代码详细说明了创建型模式: ①简单(静态)工厂:升级版本,再升级版本,多方法工厂共四种实现方式。 ②工厂方法 ③抽象工厂 ④单例模式:饿汉式、懒汉式、加锁懒汉式、DCL单例----双重锁高性能(面试重点!)、静态内部类、枚举单例、升级版静态内部类、容器式单例、ThreadLocal单例共九种实现方式。 ⑤原型模式:浅拷贝和深拷贝 ⑥建造者模式:传统的build模式和build模式变种...

qq_41889508的博客 12万+

(project generation have a problem)STM32CubeMX生成工程一直报错项目生成有问题[玄学三步解]

解决办法 第一步,检查自己是不是真的配置的不对,JAVA安装没,pack路径设置的对不对,这里有一位前辈的博文写的非常好,附加链接https://blog.youkuaiyun.com/ybhuangfugui/article/details/52225736#commentBox 第二步,如果按照前辈的博文设置的都一模一样,还是不对,想我下图这样。 那你来对地方了 方法很简单,你把你生成工程文件的路径彻底的...

展桑博客-BenjieBlog 2925

Central Finance 全景解析:用 SAP S/4HANA 构建跨系统的财务中台与渐进式转型路径

Central Finance 是基于 SAP S/4HANA 的一种部署与应用场景:在不打断现有异构源系统运营的前提下,把多套 SAP 与非 SAP 系统中的财务与管理会计数据实时/准实时复制到一套中心化的 SAP S/4HANA 中,作为统一的记账与分析底座,逐步把选定的财务流程(如预算控制、付款、固定资产结账等)迁入中心系统。这让企业既能快速获得统一报表与统一核算结构,又为未来的整体迁移留出了弹性路径。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 394

【设计模式精讲】创建型模式之抽象工厂模式、建造者模式

抽象工厂模式比工厂方法模式的抽象程度更高. 在工厂方法模式中每一个具体工厂只需要生产一种具体产品,但是在抽象工厂模式中一个具体工厂可以生产一组相关的具体产品,这样一组产品被称为产品族.产品族中的每一个产品都分属于某一个产品继承等级结构.1) 产品等级结构与产品族产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。产品族。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

YOLOv5改进 | 多尺度特征提取 | 结合多样分支块及融合的高级设计(CVPR2021)

YOLOv5改进 | 多尺度特征提取 | 结合多样分支块及融合的高级设计(CVPR2021)

qq_44224801的博客 2068

【设计模式】(万字总结)深入理解Java中的创建型设计模式

本文将带领您深入探索Java中的创建型设计模式。我们将从简单的概念入手,逐步深入到每种模式的具体实现方式和实际应用场景。

c18213590220的博客 1369

关于1EDI3033AS驱动芯片误触发DESAT保护的问题

驱动参数匹配:检查门极电阻(Rg)是否合理,过小的Rg可能加剧dv/dt干扰,而过大的Rg会增加开关损耗。SiC驱动欠压故障分为上桥故障和下桥故障,利用上位机,配置软件后上桥故障使得TestC为1,下桥故障使得TestB为1。500V母线电压,10k载频,200hz电频率,假负载大电流闭环测试时,相电流高于60A之后报SiC驱动故障。600V母线电压,10k载频,200hz电频率,接水冷,假负载350A电流闭环测试。750V母线电压,10k载频,200hz电频率,接水冷,假负载350A电流闭环测试。

小幽余生不加糖 597

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【23种设计模式】创建型模式详细介绍

本文为 【23种设计模式】创建型模式详细介绍 相关内容介绍,下边具体将对单例模式,工厂方法模式,抽象工厂模式,建造者模式,原型模式,具体包括它们的特点与实现等进行详尽介绍~

小新要变强的博客 2778

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

设计模式-创建型模式

本文主要讲解了设计模式中的创建型模式大类。包括单例模式,工厂方法模式、抽象工厂模式、原型模式、建造者模式。另外还拓展了简单工厂模式和静态工厂,希望阅读本篇文章对你们学习设计模式有所帮助。

懒洋洋的博客 1109

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JavaScript设计模式(二)——简单工厂模式、抽象工厂模式、建造者模式

本篇文章介绍了简单工厂模式和抽象工厂模式的用途及区别...

HuoZhiyan 的博客 1956

设计模式创建型

最近在进行设计模式的学习,今天将创建型的设计模式总结在这里,区分不同的设计模式的用法和作用本文讲述了设计模式中5个创建型模式,并且给出了对应的代码示例。用好设计模式可以大大的提升我们的代码的维护性、扩充性。希望大家看完这篇文章能了解,学会这5个设计模式,并且以后在用的时候能想起来。

郝老三~~~~~~~~~~~~~ 5082

设计模式:详解创建型模式(工厂、单例、建造者、原型)

近日,正在系统地学习设计模式,偶然看到David Farley(戴维·法利)的《Software Engineering: A Modern Approach》第六章Design Patterns。上来就有一句话:不考虑变化的设计,将来可能面临重大重构。确实是发人深省的一句话。书中提到,设计模式最早是由Christopher Alexander提出的。他是一位建筑师,也是加利福尼亚大学的教授。

2301_79171011的博客 413

设计模式(创建型)

不使用设计模式时,手动复制每个属性不仅容易出错,还可能导致代码冗长和难以维护。尤其当类的属性较多或者可能在未来发生变化时,手动复制每个属性的成本会增加。使用建造者模式构建拥有多个属性的复杂对象时,能够显著提高代码的可读性、可维护性和灵活性,减少出错的可能性。特别是在面对具有多个可选属性的大型对象时,建造者模式是一种非常合适的设计模式。扩展灵活性:如果要添加新的订单类型,比如国际订单,只需新增一个类和,而无需修改现有代码。低耦合性。

xue2464874018的博客 978

初探Java设计模式1:创建型模式(工厂,单例等)

Java 设计模式 转自https://javadoop.com/post/design-pattern 系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star、fork哈 文章也将发表在我的个人博客,阅读体验更佳: www.how2playlife...

AliCoder的博客 406

设计模式之创建型模式(工厂、原型、建造者)

设计模式之创建者模式(工厂、原型、建造者)

fengxiandada的博客 1037

23种设计模式简述-创建型模式-(单例、工厂、原型、建造者)

23种设计模式

Duo1J的随笔 183

【设计模式学习02】创建者模式之单例、工厂、原型、建造者模式

需求:设计一个咖啡店点餐系统。设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(CoffeeStore),咖啡店具有点咖啡的功能。具体类的设计如下:在java中,万物皆对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重,假如我们要更换对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则。......

一个正在努力学习的iter 1009

设计模式-创建型模式总结

创建型模式,顾名思义,就是用来创建对象的模式。它抽象了实例化过程,帮助一个系统独立于如何创建、组合和表示它的对象。

潘威威的博客 2560
上一篇: Android消息机制二
下一篇: 四大组件—Activity
<天各一方>
博客等级 码龄6年 17粉丝 17原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值