当前位置: 首页 > news >正文

设计模式-创建型模式

文章目录

  • 一、单例模式
    • 1.饿汉式
      • (1) 静态变量
      • (2) 静态代码块
      • (3) 枚举方式
    • 2.懒汉式
      • (1) 双检锁
      • (2) 静态内部类
    • 3.破坏单例模式
      • (1) 序列化
      • (2) 反射
    • 4.解决单例模式被破坏
      • (1) 序列化、反序列化破坏单例模式的解决方法
      • (2) 反射破坏单例解决
  • 二、工厂方法模式
    • 1.简单工厂模式
    • 2.工厂方法模式
  • 三、抽象工厂模式
  • 四、原型模式
  • 五、建造者模式

一、单例模式

涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化对象

1.饿汉式

类加载时就会导致该单例对象被创建会造成内存的浪费

(1) 静态变量

public class Singleton {//私有化构造方法  防止外界通过构造方法创建对象private Singleton(){}//创建对象private static Singleton instance = new Singleton();//提供获取对象的公共方法 采用static修饰是为了可以通过类名访问这个方法public static Singleton getInstance(){return instance;}
}public class Test {public static void main(String[] args) {Singleton singleton = Singleton.getInstance();Singleton singleton1 = Singleton.getInstance();//判断两个对象是否相同System.out.println(singleton == singleton1);}}

(2) 静态代码块

public class Singleton {private Singleton(){}//声明Singleton类型的变量private static Singleton instance;//在静态代码块中进行赋值static {instance = new Singleton();}//对外提供对象的获取方法public static Singleton getInstance(){return instance;}}public class Test {public static void main(String[] args) {Singleton instance = Singleton.getInstance();Singleton instance1 = Singleton.getInstance();//判断是否为同一个对象System.out.println(instance == instance1);}}

(3) 枚举方式

极力推荐因为枚举类型是线程安全的,并且只会装载一次,设计者充分的利用了枚举的这个特性来实现单例模式,
枚举的写法非常简单,而且枚举类型是所有单例实现中唯一一种不会被破坏的单例实现模式
public enum Singleton {INSTANCE}

2.懒汉式

类加载时不会导致该单例对象被创建,而是在首次使用该对象时才会创建

(1) 双检锁

/*** 双检锁*/
public class Singleton {//私有化构造方法 防止外界创建对象private Singleton(){}/*** volatile是为了防止返回未完全创建的对象 * 因为对象的创建在汇编阶段分为三步,防止一个线程返回另一个线程未完全创建的对象*/private static volatile Singleton instance;public static Singleton getInstance(){if (instance == null){synchronized (Singleton.class){if (instance == null){instance = new Singleton();}}}return instance;}
}

(2) 静态内部类

实例对象由内部类创建,由于 JVM 在加载外部类的过程中是不会加载静态内部类的,
只有内部类的属性/方法被调用时才会被加载,并初始化其静态属性。静态属性由于被static修饰,
保证只被实例化一次,并且严格按照实例化顺序
public class Singleton {private Singleton(){}//定义一个静态内部类private static class SingletonHolder {//在内部类中声明并初始化外部类的对象private static final Singleton instance = new Singleton();}public static Singleton getInstance(){return SingletonHolder.instance;}}

3.破坏单例模式

使上面定义的单例类可以创建多个对象,枚举方式的不能被破坏

(1) 序列化

public class Singleton implements Serializable {private Singleton(){}//定义一个静态内部类private static class SingletonHolder {//在内部类中声明并初始化外部类的对象private static final Singleton instance = new Singleton();}public static Singleton getInstance(){return SingletonHolder.instance;}}/*** 测试序列化与反序列化破坏单例模式*/
public class Test {public static void main(String[] args) throws Exception {//writeObjectToFile();//通过控制台打印可以发现两次的对象不是同一个对象readObjectFromFile();readObjectFromFile();}//从文件中读取数据(对象)public static void readObjectFromFile() throws Exception {//创建对象输入流对象ObjectInputStream ois = new ObjectInputStream(Files.newInputStream(Paths.get("a.txt")));//读取对象Singleton instance = (Singleton) ois.readObject();System.out.println(instance);//释放资源ois.close();}//向文件中写数据(对象)public static void writeObjectToFile() throws Exception {//获取Singleton对象Singleton instance = Singleton.getInstance();//创建对象输出流对象ObjectOutputStream oos = new ObjectOutputStream(Files.newOutputStream(Paths.get("a.txt")));//写对象oos.writeObject(instance);//释放资源oos.close();}}

(2) 反射

public class Singleton {private Singleton(){}//定义一个静态内部类private static class SingletonHolder {//在内部类中声明并初始化外部类的对象private static final Singleton instance = new Singleton();}public static Singleton getInstance(){return SingletonHolder.instance;}}/*** 测试反射破坏单例模式*/
public class Test {public static void main(String[] args) throws Exception {//获取Singleton的字节码对象Class clazz = Singleton.class;//获取无参构造方法对象Constructor constructor = clazz.getDeclaredConstructor();//取消访问检查constructor.setAccessible(true);//创建Singleton对象Singleton instance = (Singleton) constructor.newInstance();Singleton instanc1 = (Singleton) constructor.newInstance();System.out.println(instance == instanc1);//false 被破坏了}}

4.解决单例模式被破坏

(1) 序列化、反序列化破坏单例模式的解决方法

在Singleton类中添加 readResolve() 方法,在反序列化时被反射调用,如果定义了这个方法,
就返回这个方法的值,如果没有定义,则返回新new出来的对象
public class Singleton implements Serializable {private Singleton(){}//定义一个静态内部类private static class SingletonHolder {//在内部类中声明并初始化外部类的对象private static final Singleton instance = new Singleton();}public static Singleton getInstance(){return SingletonHolder.instance;}/*** 当进行反序列化时会自动调用该方法,将该方法的返回值直接返回*/public Object readResolve(){return SingletonHolder.instance;}}/*** 测试解决序列化与反序列化破坏单例模式*/
public class Test {public static void main(String[] args) throws Exception {//writeObjectToFile();readObjectFromFile();readObjectFromFile();}//从文件中读取数据(对象)public static void readObjectFromFile() throws Exception {//创建对象输入流对象ObjectInputStream ois = new ObjectInputStream(Files.newInputStream(Paths.get("a.txt")));//读取对象Singleton instance = (Singleton) ois.readObject();System.out.println(instance);//释放资源ois.close();}//向文件中写数据(对象)public static void writeObjectToFile() throws Exception {//获取Singleton对象Singleton instance = Singleton.getInstance();//创建对象输出流对象ObjectOutputStream oos = new ObjectOutputStream(Files.newOutputStream(Paths.get("a.txt")));//写对象oos.writeObject(instance);//释放资源oos.close();}}

(2) 反射破坏单例解决

public class Singleton {private static boolean flag = false;//私有构造方法private Singleton(){//防止多线程下出现错误synchronized (Singleton.class) {//判断flag的值是否为true,如果为true则说明这不是第一次访问 直接抛出异常if (flag){throw new RuntimeException("不能创建多个对象");}//将flag的值设置为trueflag = true;}}//定义一个静态内部类private static class SingletonHolder {//在内部类中声明并初始化外部类的对象private static final Singleton instance = new Singleton();}public static Singleton getInstance(){return SingletonHolder.instance;}}

二、工厂方法模式

1.简单工厂模式

结构:抽象产品:定义了产品的规范,描述了产品的主要特性和功能具体产品:实现或继承抽象产品的子类具体工厂:提供了创建产品的方法,调用者通过该方法来获取产品优点:封装了创建对象的过程,可以通过参数直接获取对象。把对象的创建和业务逻辑层分开,这样以后就避免了修改客户端代码,如果要实现新产品直接修改工厂类,而不需要在原代码中修改,这样就降低了客户代码修改的可能性,更加容易扩展。在多个客户端的情况下好处会很明显,不用修改每个客户端,只需要修改工厂缺点:增加新产品时还是需要修改工厂类的代码,违背了开闭原则
public abstract class Coffee {public abstract String getName();//加糖public void addSugar(){System.out.println("加糖");}//加茅台public void addWine(){System.out.println("加茅台");}
}/*** 酱香咖啡*/
public class JiangCoffee extends Coffee{@Overridepublic String getName() {return "酱香拿铁";}
}/*** 飞天咖啡*/
public class FlyCoffee extends Coffee {@Overridepublic String getName() {return "飞天咖啡";}
}/*** 简单工厂*/
public class SimpleFactory {public Coffee orderCoffee(String type){//声明coffee类型的变量,根据不同type创建对象Coffee coffee = null;if (type.equals("酱香拿铁")){coffee = new JiangCoffee();} else if (type.equals("飞天咖啡")){coffee = new FlyCoffee();} else {throw new RuntimeException("没有这种咖啡");}return coffee;}}public class CoffeeStore {public Coffee orderCoffee(String type){SimpleFactory factory = new SimpleFactory();//生产咖啡Coffee coffee = factory.orderCoffee(type);//加配料coffee.addSugar();coffee.addWine();return coffee;}}

2.工厂方法模式

定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象。工厂方法使一个产品类的实例化延迟到其
工厂的子类结构:抽象工厂:提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品具体工厂:主要是实现抽象工厂中的抽象方法,完成具体产品的创建抽象产品:定义了产品的规范,描述了产品的主要特性和功能具体产品:实现了抽象产品所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应优点:a.用户只需要知道具体工厂的名称就可以得到所要的产品,无需知道产品的具体创建过程b.在系统增加新的产品时只需要添加具体的产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则缺点:每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,增加了系统的复杂度
/*** 抽象工厂*/
public interface CoffeeFactory {//创建咖啡Coffee createCoffee();}/*** 具体工厂*/
public class JiangCoffeeFactory implements CoffeeFactory{@Overridepublic Coffee createCoffee() {return new JiangCoffee();}
}/*** 具体工厂*/
public class FlyCoffeeFactory implements CoffeeFactory{@Overridepublic Coffee createCoffee() {return new FlyCoffee();}
}public abstract class Coffee {public abstract String getName();//加糖public void addSugar(){System.out.println("加糖");}//加茅台public void addWine(){System.out.println("加茅台");}
}/*** 飞天咖啡*/
public class FlyCoffee extends Coffee {@Overridepublic String getName() {return "飞天咖啡";}
}/*** 酱香咖啡*/
public class JiangCoffee extends Coffee {@Overridepublic String getName() {return "酱香拿铁";}
}public class CoffeeStore {private CoffeeFactory factory;public void setFactory(CoffeeFactory factory){this.factory = factory;}//点咖啡public Coffee orderCoffee(){Coffee coffee = factory.createCoffee();coffee.addSugar();coffee.addWine();return coffee;}}public class Test {public static void main(String[] args) {//创建咖啡店对象CoffeeStore store = new CoffeeStore();//创建工厂对象CoffeeFactory coffeeFactory = new JiangCoffeeFactory();store.setFactory(coffeeFactory);Coffee coffee = store.orderCoffee();System.out.println(coffee.getName());}}

三、抽象工厂模式

工厂方法模式考虑的是一类产品的生产,只生产同类产品。抽象工厂模式考虑从多等级产品的生产,将同一个具体工厂所生产的位于不同级别的一组产品称为一个产品族。是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所有产品的具体类就能得到
同族的不同等级的产品的模式结构结构:抽象工厂:提供了创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品具体工厂:主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建抽象产品:定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品具体产品:实现了抽象产品角色所定义的接口,由具体工厂来创建,和具体工厂之间是多对一的关系优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族的对象缺点:当产品组中需要增加一个新的产品时,所有的工厂类都需要进行修改
public abstract class Coffee {public abstract String getName();//加糖public void addSugar(){System.out.println("加糖");}//加茅台public void addWine(){System.out.println("加茅台");}
}/*** 飞天咖啡*/
public class FlyCoffee extends Coffee {@Overridepublic String getName() {return "飞天咖啡";}
}/*** 酱香咖啡*/
public class JiangCoffee extends Coffee {@Overridepublic String getName() {return "酱香拿铁";}
}/*** 甜品抽象类*/
public abstract class Dessert {public abstract void show();}public class JiangChocolate extends Dessert{@Overridepublic void show() {System.out.println("酱香巧克力");}
}public class FlyChocolate extends Dessert{@Overridepublic void show() {System.out.println("飞天巧克力");}
}/*** 抽象工厂*/
public interface DessertFactory {//生产咖啡Coffee createCoffee();//生产甜品Dessert createDessert();}/*** 酱香工厂*/
public class JiangFactory implements DessertFactory{@Overridepublic Coffee createCoffee() {return new JiangCoffee();}@Overridepublic Dessert createDessert() {return new JiangChocolate();}
}/*** 飞天工厂*/
public class FlyFactory implements DessertFactory{@Overridepublic Coffee createCoffee() {return new FlyCoffee();}@Overridepublic Dessert createDessert() {return new FlyChocolate();}
}public class Client {public static void main(String[] args) {//创建酱香工厂JiangFactory factory = new JiangFactory();Coffee coffee = factory.createCoffee();Dessert dessert = factory.createDessert();System.out.println(coffee.getName());dessert.show();}}

四、原型模式

用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象结构:抽象原型类:规定了具体原型对象必须实现的 clone() 方法具体原型类:实现抽象圆形类的 clone() 方法,它是可被复制的对象访问类:使用具体原型类中的 clone() 方法来复制新的对象克隆:浅克隆:创建一个新对象,新对象的属性和原来对象属性完全相同,对于引用数据类型,仍指向原有属性所指向的对象的内存地址深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象的地址。采用序列化和反序列化来深克隆使用场景:对象的创建非常复杂,可以使用原型模式快捷的创建对象性能和安全要求比较高的时候
public class Citation implements Cloneable{private String name;//学生姓名public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic Citation clone() throws CloneNotSupportedException {return (Citation) super.clone();}public void show(){System.out.println(name + " 同学 : 获得奖状");}
}public class CitationTest {public static void main(String[] args) throws CloneNotSupportedException {//原型对象Citation citation = new Citation();//克隆对象Citation clone = citation.clone();citation.setName("小白");clone.setName("小黑");citation.show();clone.show();}}

深克隆

public class Citation implements Cloneable, Serializable {private Student student;public Student getStudent() {return student;}public void setStudent(Student student) {this.student = student;}@Overridepublic Citation clone() throws CloneNotSupportedException {return (Citation) super.clone();}public void show(){System.out.println(student.getName() + " 同学 : 获得奖状");}
}public class Student implements Serializable {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +'}';}
}public class Test {public static void main(String[] args) throws Exception {//原型对象Citation citation = new Citation();Student student = new Student();student.setName("小白");citation.setStudent(student);//克隆对象 采取深克隆//创建对象输出流对象ObjectOutputStream oos = new ObjectOutputStream(Files.newOutputStream(Paths.get("a.txt")));//写对象oos.writeObject(citation);//释放资源oos.close();//创建对象输入流对象ObjectInputStream ois = new ObjectInputStream(Files.newInputStream(Paths.get("a.txt")));//读取对象Citation citation1 = (Citation) ois.readObject();//释放资源ois.close();citation1.getStudent().setName("小黑");citation.show();citation1.show();}}

五、建造者模式

将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。适用于某个对象的构建过程复杂的情况实现了构建和装配的解耦。不同的构建器、相同的装配,可以做出不同的对象;相同的构建器、
不同的装配顺序也可以做出不同的对象。结构:抽象建造者类(builder):规定要实现复杂对象的哪些部分的创建,并不涉及具体的部件对象的创建具体建造者类:实现 builder ,完成复杂产品的各个部件的具体创建方法。在构造过程完成后,提供产品的实例产品类:要创建的复杂对象指挥者类:调用具体建造者来创建复杂对象的各个部分,在指挥者中不涉及具体的产品信息,只负责保证对象各部分完整创建或按某种顺序创建优点:a.封装性很好。使用建造者模式可以很好的封装变化,在使用建造者模式的场景中,一般产品类和建造者类是比较稳定的,因此将主要的业务逻辑封装在指挥者类中对整体而言可以取得比较好的稳定性b.产品本身与产品的创建过程解耦c.可以更加精细的控制产品的创建过程。d.很容易进行扩展。如果有新的需求,通过实现一个新的建造者类就可以完成缺点:建造者模式所创建的产品一般具有较多的共同点,其组成部分相似。如果产品之间的差异性很大,则不适合使用建造者模式
/*** 车座*/
public class Seat {private String name;//材质public String getName() {return name;}public void setName(String name) {this.name = name;}
}/*** 车架*/
public class Frame {private String name;//材质public String getName() {return name;}public void setName(String name) {this.name = name;}
}/*** 自行车产品对象*/
public class Bike {private Seat seat;//车座private Frame frame;//车架public Seat getSeat() {return seat;}public void setSeat(Seat seat) {this.seat = seat;}public Frame getFrame() {return frame;}public void setFrame(Frame frame) {this.frame = frame;}
}public abstract class Builder {protected Bike bike = new Bike();protected Seat seat = new Seat();protected Frame frame = new Frame();public abstract void builderFrame();public abstract void builderSeat();public abstract Bike createBike();
}/*** 具体构建者:构建飞鸽牌自行车*/
public class FeiGeBuilder extends Builder{@Overridepublic void builderFrame() {frame.setName("碳纤维车架");bike.setFrame(frame);}@Overridepublic void builderSeat() {seat.setName("真皮车座");bike.setSeat(seat);}@Overridepublic Bike createBike() {return bike;}
}/*** 具体构建者:构建二八大杠自行车*/
public class GangBuilder extends Builder{@Overridepublic void builderFrame() {frame.setName("铁车架");bike.setFrame(frame);}@Overridepublic void builderSeat() {seat.setName("橡胶车座");bike.setSeat(seat);}@Overridepublic Bike createBike() {return bike;}
}/*** 指挥者类*/
public class Director {private Builder builder;public Director(Builder builder){this.builder = builder;}//组装自行车public Bike construct(){builder.builderFrame();builder.builderSeat();return builder.createBike();}
}public class Client {public static void main(String[] args) {Director director = new Director(new FeiGeBuilder());//组装自行车Bike bike = director.construct();System.out.println(bike.getFrame().getName());System.out.println(bike.getSeat().getName());}}

相关文章:

设计模式-创建型模式

文章目录 一、单例模式1.饿汉式(1) 静态变量(2) 静态代码块(3) 枚举方式 2.懒汉式(1) 双检锁(2) 静态内部类 3.破坏单例模式(1) 序列化(2) 反射 4.解决单例模式被破坏(1) 序列化、反序列化破坏单例模式的解决方法(2) 反射破坏单例解决 二、工厂方法模式1.简单工厂模式2.工厂方法…...

golang中的RSA算法,加密解密,签名校验,导出公钥密钥,导入公钥密钥

RSA算法广泛应用与数据加密(比如 SSL 传输层加密),数字签名(比如支付宝的支付签名)。 1、加密解密 // encrypts the given message with RSA-OAEP func f1() {// random 用来生成随机的素数rsaPriviteKey, err : rsa…...

修炼k8s+flink+hdfs+dlink(四:k8s(二)组件)

一:控制平面组件。 控制平面组件会为集群做出全局决策,比如资源的调度。 以及检测和响应集群事件,例如当不满足部署的 replicas 字段时, 要启动新的 pod)。 1. kube-apiserver。 该组件负责公开了 Kubernetes API&a…...

Android约束布局ConstraintLayout流式Flow

Android约束布局ConstraintLayout流式Flow <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.…...

Android JNI代码语法解释

文章目录 JNI中的JNIEXPORT、JNIIMPORT和JNICALLJVM如何查找native方法①按照JNI规范的命名规则②调用JNI提供的RegsterNatives函数&#xff0c;将本地函数注册到JVM中示例代码 JNI数据类型JNI字符串的处理①获取字符串②释放字符串③创建字符串④其他字符串处理API JNI中的JNI…...

小程序和前台开发软件定制的相关信息|APP网站搭建

小程序和前台开发软件定制的相关信息 在如今数字化时代&#xff0c;软件、小程序和前台开发软件定制已经成为了企业必备的工具之一。那么&#xff0c;这些工具到底有什么作用呢&#xff1f;接下来&#xff0c;我将为大家详细介绍。 首先&#xff0c;让我们来了解一下软件。软件…...

JVM监控及诊断工具-GUI篇

文章目录 JVM监控及诊断工具-GUI篇工具概述JConsoleVisual VM再谈内存泄漏Java中内存泄漏的8种情况Arthas&#xff08;阿尔萨斯&#xff09;康师傅使用阿尔萨斯的例子help指令 JVM监控及诊断工具-GUI篇 工具概述 使用上一章命令行工具或组合能获取目标Java应用性能相关的基础…...

【C++STL基础入门】list基本使用

文章目录 前言一、list简介1.1 list是什么1.2 list的头文件 二、list2.1 定义对象2.2 list构造函数2.3 list的属性函数 总结 前言 STL&#xff08;Standard Template Library&#xff09;是C标准库的一个重要组成部分&#xff0c;提供了一套丰富的数据结构和算法&#xff0c;可…...

WSL+vscode配置miniob环境

1.配置WSL Windows Subsystem for Linux入门&#xff1a;安装配置图形界面中文环境vscode wu-kan 2.获取源码 找个位置Git Bash然后拉取代码 git clone https://github.com/oceanbase/miniob.git 3.安装相关依赖 https://gitee.com/liangcha-xyy/source/blob/master/how…...

Flutter SliverAppBar 吸顶效果

吸顶是常见的布局&#xff0c;主要使用的是CustomScrollView 和SliverApp组件实现的 页面布局 overrideWidget build(BuildContext context) {return CustomScrollView(controller: controller.scrollController!,physics: const BouncingScrollPhysics(),slivers: [SliverApp…...

Java Spring Boot 自动装配:简化配置和提高开发效率

Spring Boot 自动装配是 Spring Boot 提供的一种特性&#xff0c;它可以根据应用程序的依赖关系和配置信息&#xff0c;自动配置应用程序的各种组件和功能。这样&#xff0c;开发者可以将更多的精力放在业务逻辑的实现上&#xff0c;而不需要手动配置和管理各种组件。 1. 自动…...

对象转换之modelmapper

1. 官网地址&#xff1a;http://modelmapper.org 源码地址&#xff1a;GitHub - modelmapper/modelmapper: Intelligent object mapping 2.实现原理&#xff1a; 主要是基于匹配策略进行属性的转化&#xff0c;目前支持三种策略&#xff1a; 2.1 Standard&#xff08;默认标准…...

Ant Design+react 路由跳转

今天我们来继续探讨react的路由跳转 首先&#xff0c;创建router文件夹中的index import { lazy } from "react"; import { Outlet,useRoutes } from react-router-dom; //引入页面&#xff0c;引用了路由懒加载 const One lazy(() > import(../pages/one)); c…...

提高爬虫效率的秘诀之一:合理配置库池数量

在提高爬虫效率的过程中&#xff0c;合理配置库池数量是一个重要的秘诀。通过增加或减少库池的数量&#xff0c;可以有效提升爬虫系统的效率和稳定性。本文将介绍如何合理配置库池数量&#xff0c;以及配置不同数量库池的优缺点&#xff0c;帮助您提高爬虫效率&#xff0c;顺利…...

初学者必看,前端 Debugger 调试学习

1.文章简介&#xff1a; 报错和Bug&#xff0c;是贯穿程序员整个编程生涯中&#xff0c;无法回避的问题。而调试&#xff0c;就是帮助程序员定位问题、解决问题的重要手段&#xff0c;因此调试是每个程序员必备技能。 调试本身可分为两个过程: 定位问题 和 解决问题&#xff0…...

Dubbo—Admin 整体架构与安装步骤

​回顾 Dubbo 服务治理体系的总体架构&#xff0c;Admin 是服务治理控制面中的一个核心组件&#xff0c;负责微服务集群的服务治理、可视化展示等。 Admin 部署架构 总体上来说&#xff0c;Admin 部署架构分为以下几个部分&#xff1a; Admin 主进程&#xff0c;包括服务发现…...

C++11打断线程的几种方式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pthread_cancel1.代码演示2.两个重要方法1.pthread_setcancelstate2.pthread_setcanceltype 3.资源回收 二、Boost1.看代码2.资源泄露2.资源回收 总结 前言…...

如何提升网站排名和用户体验:优化网站速度

网站的排名和用户满意度直接受到站点内容的加载速度影响深远。通过精心的网站优化&#xff0c;您不仅可以提高排名&#xff0c;还可以提供更出色的用户体验&#xff0c;尽管用户可能不会察觉到您的网站加载得更快&#xff0c;但这是一个非常有意义的改进。在这篇文章中&#xf…...

【Redis】Hash 哈希内部编码方式

Hash 哈希内部编码方式 哈希的内部编码有两种&#xff1a; ziplist&#xff08;压缩列表&#xff09;&#xff1a;当哈希类型元素个数⼩于hash-max-ziplist-entries配置&#xff08;默认512个&#xff09;、同时所有值都⼩于hash-max-ziplist-value配置&#xff08;默认64字节…...

JUC第二十八讲:JUC工具类: Semaphore详解

JUC工具类: Semaphore详解 本文是JUC第二十八讲&#xff0c;JUC工具类: Semaphore详解。Semaphore底层是基于AbstractQueuedSynchronizer来实现的。Semaphore称为计数信号量&#xff0c;它允许n个任务同时访问某个资源&#xff0c;可以将信号量看做是在向外分发使用资源的许可证…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...