Java设计模式之创建型模式(二)原型模式

原型模式

    • 1、原型模式
      • 1-1、应用场景
      • 1-2、举个 软栗子
      • 1-3、举个 硬栗子
      • 1-3、举个实务栗子

学习原型模式的目的:原型模式的目的在于通过复制现有的实例来创建新的对象,以避免通过构造函数创建对象时可能带来的性能开销,同时可以控制对象的深度复制。

1、原型模式

定义:
在Java中,原型模式(Prototype Pattern)是一种创建型设计模式,其主要目的是通过使用已有对象作为原型,克隆并生成新的对象,而无需显式地使用构造函数来创建对象。原型模式的核心思想是通过克隆(Clone)现有的对象来创建新的对象,这种克隆可以是浅克隆(Shallow Clone)或深克隆(Deep Clone)。

  • 浅克隆:通过调用对象的clone()方法复制对象,得到一个新的对象实例,新对象与原对象共享部分数据。对于引用类型的成员变量,浅克隆只复制其引用而不创建新的对象。
  • 深克隆:通过自定义克隆逻辑,递归地复制对象及其引用类型的成员变量,得到一个完全独立的新对象实例。深克隆会逐层复制对象及其引用的对象,保证新对象与原对象的数据完全独立。

要实现原型模式,需要满足以下条件:

  1. 被克隆的类必须实现Cloneable接口,这个接口是一个标记接口,表明该类可以被克隆。
  2. 在被克隆的类中覆写clone()方法,实现对象的克隆操作。
  3. 在使用原型模式时,通过调用对象的clone()方法创建新的对象。

通过使用原型模式,可以避免直接使用构造函数复杂地创建对象,提高对象的创建效率和灵活性。
需要注意的是,在克隆过程中如果涉及到引用类型的成员变量,如果要实现深克隆,需要对引用类型的成员变量也进行克隆操作,确保数据的独立性和完整性。
总的来说,原型模式通过克隆现有对象来创建新的对象,实现了对象的复制和创建的分离,提高了对象创建的效率和灵活性。

1-1、应用场景

Java中的原型模式适用于以下业务应用场景:

  1. 对象的创建成本高:当需要创建一个对象的成本很高,比如需要初始化大量的数据、进行复杂的计算或者远程调用等,可以使用原型模式。通过复制已有的对象,避免重复的创建过程,提高性能和效率
  2. 对象的创建过程复杂:有些对象的创建过程比较复杂,涉及到多个步骤或者依赖其他对象。在这种情况下,可以使用原型模式将一个已经初始化好的对象作为原型,通过复制来创建新对象,避免创建过程的复杂性和依赖关系的传递
  3. 动态配置对象:当需要根据用户的不同配置动态生成对象时,可以使用原型模式。通过定义一个原型对象,根据不同的配置参数进行复制,快速生成多个符合用户需求的对象
  4. 多线程环境下的对象创建:在多线程环境下,对象的创建可能会引起线程安全的问题。使用原型模式,可以避免多个线程同时创建对象,从而保证对象的安全性和一致性。

总的来说,原型模式适用于那些创建成本高、创建过程复杂、动态配置或需要在多线程环境下创建对象的场景。通过原型模式,可以通过复制现有的对象来创建新对象,提高性能、简化对象的创建过程,并保证对象的安全性和一致性。

1-2、举个 软栗子

代码如下


写个Person实现Cloneable接口:

package com.rensun.designmode.prototype_mode.shallowcopy2;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person implements Cloneable {

    private int id;
    private String name;
    private Address address;

    @Override
    public Person clone() throws CloneNotSupportedException {
        return (Person) super.clone();
    }
}

写个Address实现Cloneable接口:

package com.rensun.designmode.prototype_mode.shallowcopy2;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
class Address implements Cloneable {

    private String city;
    private String street;

    @Override
    public Address clone() throws CloneNotSupportedException {
        return (Address) super.clone();
    }
}

写个测试方法:

package com.rensun.designmode.prototype_mode.shallowcopy2;


import lombok.extern.slf4j.Slf4j;


/**
 *  使用场景:
 *  软拷贝适用于对象的字段较简单,不包含引用类型字段
 *  的情况,而且希望拷贝后的对象能够及时地反映原对象
 *  字段的变化。例如,当对象只包含基本数据类型的字段,
 *  且需要对对象进行快速的拷贝操作,可以使用软拷贝。
 *
 */
@Slf4j
public class TestShallowCopy {

    public static void main(String[] args) {

        Address address = new Address("濮阳市", "挥公大道003号");
        Person person = new Person(1, "岳云鹏", address);

        try {
            Person copyPerson = person.clone();
            log.info("person: {}", person);
            log.info("shallow copy person: {}", copyPerson);

            //拷贝后的对象重新赋值
            copyPerson.setId(2);
            copyPerson.setName("小驴程序源");
            copyPerson.getAddress().setCity("北京市");
            copyPerson.getAddress().setStreet("长安街110号");

            log.info("------------------拷贝后的对象重新赋值如下:--------------------");
            log.info("person: {}", person);
            log.info("shallow copy person: {}", copyPerson);
        } catch (CloneNotSupportedException e) {
            log.error("Clone not supported", e);
        }
    }
}

我们看一下console输出

已连接到地址为 ''127.0.0.1:52221',传输: '套接字'' 的目标虚拟机
17:15:14.526 [main] INFO com.rensun.designmode.prototype_mode.shallowcopy2.TestShallowCopy - person: Person(id=1, name=岳云鹏, address=Address(city=濮阳市, street=挥公大道003号))
17:15:14.530 [main] INFO com.rensun.designmode.prototype_mode.shallowcopy2.TestShallowCopy - shallow copy person: Person(id=1, name=岳云鹏, address=Address(city=濮阳市, street=挥公大道003号))
17:15:14.530 [main] INFO com.rensun.designmode.prototype_mode.shallowcopy2.TestShallowCopy - ------------------拷贝后的对象重新赋值如下:--------------------
17:15:14.530 [main] INFO com.rensun.designmode.prototype_mode.shallowcopy2.TestShallowCopy - person: Person(id=1, name=岳云鹏, address=Address(city=北京市, street=长安街110号))
17:15:14.530 [main] INFO com.rensun.designmode.prototype_mode.shallowcopy2.TestShallowCopy - shallow copy person: Person(id=2, name=小驴程序源, address=Address(city=北京市, street=长安街110号))
已与地址为 ''127.0.0.1:52221',传输: '套接字'' 的目标虚拟机断开连接

进程已结束,退出代码为 0

根据输出结果,可以看到以下信息:

原对象person的信息为:Person(id=1, name=岳云鹏, address=Address(city=濮阳市, street=挥公大道003号))
浅拷贝对象copyPerson的信息为:Person(id=1, name=岳云鹏, address=Address(city=濮阳市, street=挥公大道003号))
拷贝后的对象重新赋值后,原对象person的信息为:Person(id=1, name=岳云鹏, address=Address(city=北京市, street=长安街110号))
拷贝后的对象重新赋值后,浅拷贝对象copyPerson的信息为:Person(id=2, name=小驴程序源, address=Address(city=北京市, street=长安街110号))

从输出结果来看,当对拷贝后的对象copyPerson进行了修改时,原对象person的数据并没有发生变化。这是因为浅拷贝只复制了对象的引用,并没有对引用的对象进行深拷贝。因此,当拷贝对象的引用类型成员变量进行修改时,原对象的成员变量也会相应改变


1-3、举个 硬栗子

在这里插入图片描述

首先Address还是原来的它自己,Person要改写一下clone方法

package com.rensun.designmode.prototype_mode.deepcopy2;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Slf4j
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person implements Cloneable {

    private int id;
    private String name;
    private Address address;

    @Override
    public Person clone() throws CloneNotSupportedException {
        Person cPerson = (Person) super.clone();
        cPerson.address = this.address.clone();
        return cPerson;
    }
}

测试类还是原来的测试类,改了个名

package com.rensun.designmode.prototype_mode.deepcopy2;


import lombok.extern.slf4j.Slf4j;


/**
 *  使用场景:
 *  硬拷贝适用于对象的字段较复杂,包含引用类型字段的情
 *  况,希望拷贝后的对象能够独立地管理自己的字段,不受
 *  原对象影响。例如,当对象包含引用类型的字段,且需要
 *  对对象进行深度拷贝,确保拷贝后的对象与原对象完全独
 *  立,可以使用硬拷贝。
 *
 */
@Slf4j
public class TestDeepCopy {

    public static void main(String[] args) {

        Address address = new Address("濮阳市", "挥公大道003号");
        Person person = new Person(1, "岳云鹏", address);

        try {
            Person copyPerson = person.clone();
            log.info("person: {}", person);
            log.info("shallow copy person: {}", copyPerson);

            //拷贝后的对象重新赋值
            copyPerson.setId(2);
            copyPerson.setName("小驴程序源");
            copyPerson.getAddress().setCity("北京市");
            copyPerson.getAddress().setStreet("长安街110号");

            log.info("------------------拷贝后的对象重新赋值如下:--------------------");
            log.info("person: {}", person);
            log.info("shallow copy person: {}", copyPerson);
        } catch (CloneNotSupportedException e) {
            log.error("Clone not supported", e);
        }
    }
}

但是输出结果就有了新变化:

在clone()方法中,首先调用了父类的clone()方法创建了一个新的Person对象,并进行类型转换。接着,通过调用this.address.clone()方法对地址对象进行深拷贝,将拷贝后的地址对象赋值给新创建的Person对象的地址成员变量。这样就实现了深拷贝,拷贝后的对象和原对象拥有了各自的地址对象,互不影响。

总的来说,这段代码示例展示了如何通过在clone()方法中对引用类型成员变量进行深拷贝操作,实现了深拷贝的Person类。通过这种方式,即使修改拷贝对象的引用类型成员变量,原对象的成员变量也不会受到影响

已连接到地址为 ''127.0.0.1:53498',传输: '套接字'' 的目标虚拟机
18:04:04.663 [main] INFO com.rensun.designmode.prototype_mode.deepcopy2.TestDeepCopy - person: Person(id=1, name=岳云鹏, address=Address(city=濮阳市, street=挥公大道003号))
18:04:04.669 [main] INFO com.rensun.designmode.prototype_mode.deepcopy2.TestDeepCopy - shallow copy person: Person(id=1, name=岳云鹏, address=Address(city=濮阳市, street=挥公大道003号))
18:04:04.669 [main] INFO com.rensun.designmode.prototype_mode.deepcopy2.TestDeepCopy - ------------------拷贝后的对象重新赋值如下:--------------------
18:04:04.669 [main] INFO com.rensun.designmode.prototype_mode.deepcopy2.TestDeepCopy - person: Person(id=1, name=岳云鹏, address=Address(city=濮阳市, street=挥公大道003号))
18:04:04.669 [main] INFO com.rensun.designmode.prototype_mode.deepcopy2.TestDeepCopy - shallow copy person: Person(id=2, name=小驴程序源, address=Address(city=北京市, street=长安街110号))
已与地址为 ''127.0.0.1:53498',传输: '套接字'' 的目标虚拟机断开连接

1-3、举个实务栗子

package com.tansun.goods.controller;


import cn.hutool.json.JSONUtil;
import com.tansun.goods.prototype_mode.AnswerQuestion;
import com.tansun.goods.prototype_mode.ChoiceQuestion;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Administrator
 */
@Slf4j
@RestController
@RequestMapping
public class TestController {

    public String createPaper(String candidate, String number) {
        //选择题
        List<ChoiceQuestion> choiceQuestionList = new ArrayList<ChoiceQuestion>();
        //问答题
        List<AnswerQuestion> answerQuestionList = new ArrayList<AnswerQuestion>();
        Map<String, String> map01 = new HashMap<String, String>();
        map01.put("A", "JAVA2 EE");
        map01.put("B", "JAVA2 Card");
        map01.put("C", "JAVA2 ME");
        map01.put("D", "JAVA2 HE");
        map01.put("E", "JAVA2 SE");
        Map<String, String> map02 = new HashMap<String, String>();
        map02.put("A", "JAVA程序的main⽅法必须写在类⾥⾯");
        map02.put("B", "JAVA程序中可以有多个main⽅法");
        map02.put("C", "JAVA程序中类名必须与⽂件名⼀样");
        map02.put("D", "JAVA程序的main⽅法中如果只有⼀条语句,可以不⽤{}(⼤括号)括起来");
        Map<String, String> map03 = new HashMap<String, String>();
        map03.put("A", "变量由字⺟、下划线、数字、$符号随意组成;");
        map03.put("B", "变量不能以数字作为开头;");
        map03.put("C", "A和a在java中是同⼀个变量;");
        map03.put("D", "不同类型的变量,可以起相同的名字;");
        Map<String, String> map04 = new HashMap<String, String>();
        map04.put("A", "STRING");
        map04.put("B", "x3x;");
        map04.put("C", "void");
        map04.put("D", "de$f");
        Map<String, String> map05 = new HashMap<String, String>();
        map05.put("A", "31");
        map05.put("B", "0");
        map05.put("C", "1");
        map05.put("D", "2");
        
        choiceQuestionList.add(new ChoiceQuestion("JAVA所定义的版本中不包括", map01, "D"));
        choiceQuestionList.add(new ChoiceQuestion("下列说法正确的是", map02, "A"));
        choiceQuestionList.add(new ChoiceQuestion("变量命名规范说法正确的是", map03, "B"));
        choiceQuestionList.add(new ChoiceQuestion("以下()不是合法的标识符", map04, "C"));
        choiceQuestionList.add(new ChoiceQuestion("表达式(11+3*8)/4%3的值 是", map05, " D"));

        answerQuestionList.add(new AnswerQuestion("⼩红⻢和⼩⿊⻢⽣的⼩⻢⼏条腿", "4条腿"));
        answerQuestionList.add(new AnswerQuestion("铁棒打头疼还是⽊棒打头疼", "头最疼"));
        answerQuestionList.add(new AnswerQuestion("什么床不能睡觉", "⽛床"));
        answerQuestionList.add(new AnswerQuestion("为什么好⻢不吃回头草", "后⾯的草没了"));

        //打印当前考生的试卷
        StringBuilder detail = new StringBuilder("考⽣:" + candidate + "\r\n" + "考号:" + number + "\r\n" + "--------------------------------------------\r\n" + "⼀、选择题" + "\r\n\n");
        for (int idx = 0; idx < choiceQuestionList.size(); idx++) {
            detail.append("第").append(idx + 1).append("题:").append(choiceQuestionList.get(idx).getName()).append("\n");
            Map<String, String> option = choiceQuestionList.get(idx).getOption();
            option.forEach((k,v)->detail.append(k).append(":").append(option.get(k)).append("\r\n"));
            detail.append("答 案:").append(choiceQuestionList.get(idx).getKey()).append("\r\n\n");
        }
        detail.append("⼆、问答题" + "\r\n\n");
        for (int idx = 0; idx < answerQuestionList.size(); idx++) {
            detail.append("第").append(idx + 1).append("题:").append(answerQuestionList.get(idx).getName()).append("\n");
            detail.append("答 案:").append(answerQuestionList.get(idx).getKey()).append("\r\n\n");
        }
        return detail.toString();
    }
}

选择题类

package com.tansun.goods.prototype_mode;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Map;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ChoiceQuestion {
    /**
     * 题⽬
     */
    private String name;
    /**
     * 选项A、B、C、D
     */
    private Map<String, String> option;
    /**
     * 答案B
     */
    private String key;
}

问答题

package com.tansun.goods.prototype_mode;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class AnswerQuestion {
    /**
     * 问题
     */
    private String name;
    /**
     * 答案
     */
    private String key;
}

运行:

package com.tansun.goods;

import com.tansun.goods.controller.TestController;
import org.apache.catalina.core.ApplicationContext;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;

@SpringBootTest
class GoodsApplicationTests {

    @Test
    public void test_QuestionBankController() {
        TestController questionBankController = new TestController();
        System.out.println(questionBankController.createPaper("花花", "1000001921032"));
        System.out.println(questionBankController.createPaper("⾖⾖", "1000001921051"));
        System.out.println(questionBankController.createPaper("⼤宝", "1000001921987"));
    }

}

结果:

考⽣:花花
考号:1000001921032
--------------------------------------------
⼀、选择题

第1题:JAVA所定义的版本中不包括
AJAVA2 EE
BJAVA2 Card
CJAVA2 ME
DJAVA2 HE
EJAVA2 SE
答 案:D2题:下列说法正确的是
AJAVA程序的main⽅法必须写在类⾥⾯
BJAVA程序中可以有多个main⽅法
CJAVA程序中类名必须与⽂件名⼀样
DJAVA程序的main⽅法中如果只有⼀条语句,可以不⽤{}(⼤括号)括起来
答 案:A3题:变量命名规范说法正确的是
A:变量由字⺟、下划线、数字、$符号随意组成;
B:变量不能以数字作为开头;
CA和a在java中是同⼀个变量;
D:不同类型的变量,可以起相同的名字;
答 案:B4题:以下()不是合法的标识符
ASTRING
B:x3x;
Cvoid
D:de$f
答 案:C5题:表达式(11+3*8)/4%3的值 是
A31
B0
C1
D2
答 案: D

⼆、问答题

第1题:⼩红⻢和⼩⿊⻢⽣的⼩⻢⼏条腿
答 案:4条腿

第2题:铁棒打头疼还是⽊棒打头疼
答 案:头最疼

第3题:什么床不能睡觉
答 案:⽛床

第4题:为什么好⻢不吃回头草
答 案:后⾯的草没了


考⽣:⾖⾖
考号:1000001921051
--------------------------------------------
⼀、选择题

第1题:JAVA所定义的版本中不包括
AJAVA2 EE
BJAVA2 Card
CJAVA2 ME
DJAVA2 HE
EJAVA2 SE
答 案:D2题:下列说法正确的是
AJAVA程序的main⽅法必须写在类⾥⾯
BJAVA程序中可以有多个main⽅法
CJAVA程序中类名必须与⽂件名⼀样
DJAVA程序的main⽅法中如果只有⼀条语句,可以不⽤{}(⼤括号)括起来
答 案:A3题:变量命名规范说法正确的是
A:变量由字⺟、下划线、数字、$符号随意组成;
B:变量不能以数字作为开头;
CA和a在java中是同⼀个变量;
D:不同类型的变量,可以起相同的名字;
答 案:B4题:以下()不是合法的标识符
ASTRING
B:x3x;
Cvoid
D:de$f
答 案:C5题:表达式(11+3*8)/4%3的值 是
A31
B0
C1
D2
答 案: D

⼆、问答题

第1题:⼩红⻢和⼩⿊⻢⽣的⼩⻢⼏条腿
答 案:4条腿

第2题:铁棒打头疼还是⽊棒打头疼
答 案:头最疼

第3题:什么床不能睡觉
答 案:⽛床

第4题:为什么好⻢不吃回头草
答 案:后⾯的草没了


考⽣:⼤宝
考号:1000001921987
--------------------------------------------
⼀、选择题

第1题:JAVA所定义的版本中不包括
AJAVA2 EE
BJAVA2 Card
CJAVA2 ME
DJAVA2 HE
EJAVA2 SE
答 案:D2题:下列说法正确的是
AJAVA程序的main⽅法必须写在类⾥⾯
BJAVA程序中可以有多个main⽅法
CJAVA程序中类名必须与⽂件名⼀样
DJAVA程序的main⽅法中如果只有⼀条语句,可以不⽤{}(⼤括号)括起来
答 案:A3题:变量命名规范说法正确的是
A:变量由字⺟、下划线、数字、$符号随意组成;
B:变量不能以数字作为开头;
CA和a在java中是同⼀个变量;
D:不同类型的变量,可以起相同的名字;
答 案:B4题:以下()不是合法的标识符
ASTRING
B:x3x;
Cvoid
D:de$f
答 案:C5题:表达式(11+3*8)/4%3的值 是
A31
B0
C1
D2
答 案: D

⼆、问答题

第1题:⼩红⻢和⼩⿊⻢⽣的⼩⻢⼏条腿
答 案:4条腿

第2题:铁棒打头疼还是⽊棒打头疼
答 案:头最疼

第3题:什么床不能睡觉
答 案:⽛床

第4题:为什么好⻢不吃回头草
答 案:后⾯的草没了

进程已结束,退出代码0

以上就是三位考试的试卷; 花花、 ⾖、⼤宝,每个⼈的试卷内容是⼀样的这没问题,但是三个⼈的题⽬以及选项顺序都是⼀样,就没有达到我们说希望的乱序要求。⽽且以上这样的代码⾮常难扩展,随着题⽬的不断的增加以及乱序功能的补充,都会让这段代码变
得越来越混乱

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/527624.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Matlab|基于蒙特卡洛的风电功率/光伏功率场景生成方法

目录 主要内容 部分代码 结果一览 下载链接 主要内容 该模型主要用于风电功率和光伏功率场景生成与缩减&#xff0c;利用多元高斯分布构建时间相关性&#xff0c;并采用蒙特卡洛方法进行仿真&#xff0c;风电功率采用Weibull分布&#xff0c;光伏功率采用Beta分布…

浅析人工智能与数字化的特点

人工智能无疑具有数字化的特点。作为现代科技的一个重要分支&#xff0c;人工智能的发展与数字化进程紧密相连&#xff0c;数字化已经成为了人工智能发展的基础和前提。 首先&#xff0c;我们来理解一下什么是数字化。数字化是将模拟信号转换为数字信号的过程&#xff0c;即将连…

[论文阅读笔记30] (AAAI2024) UCMCTrack: Multi-Object Tracking with Uniform CMC 详细推导

这是群友的一篇工作&#xff0c;之前也没仔细看&#xff0c;正好今天放假&#xff0c;打算读一下论文陶冶情操。 这篇文章的公式比较多&#xff0c;我做一篇笔记解释一下&#xff0c;希望对大家有帮助~ 论文地址: https://ojs.aaai.org/index.php/AAAI/article/view/28493 代…

java数据结构与算法刷题-----LeetCode238. 除自身以外数组的乘积

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 动态规划&#xff1a;左右乘积列表2. 滚动数组对动态规划过程…

uni-app(H5)论坛 | 社区 表情选择 UI组件

项目源码请移步&#xff1a;bbs 效果 实现思路 表情切换 人物、动物、小黄人不同表情之间的切换实际就是组件的切换 emoji表情 emoji表情本身就是一种字符 如需其他emoji表情可参考 EmojiAll中文官方网站 需要注意的就是数据库的存储格式需要支持emoji表情&#xff0c;我项…

聚道云连接器打通红圈CRM和金蝶云星辰,赋能环境科技公司数字化转型

一、客户介绍 某环境科技有限公司是一家专注于环保科技领域的领先企业&#xff0c;致力于为客户提供全方位的环境解决方案。公司拥有一支经验丰富、技术精湛的团队&#xff0c;不断推动环保技术的创新与应用。作为业内的佼佼者&#xff0c;该公司在环境治理、资源回收和节能减…

zookeeper源码(12)命令行客户端

zkCli.sh脚本 这个命令行脚本在bin目录下&#xff1a; ZOOBIN"${BASH_SOURCE-$0}" ZOOBIN"$(dirname "${ZOOBIN}")" ZOOBINDIR"$(cd "${ZOOBIN}"; pwd)"# 加载zkEnv.sh脚本 if [ -e "$ZOOBIN/../libexec/zkEnv.sh&qu…

GitHub教程:最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图文教程)

&#x1f42f; GitHub教程&#xff1a;最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图文教程) &#x1f4c1; 文章目录 &#x1f42f; GitHub教程&#xff1a;最新如何从GitHub上下载文件(下载单个文件或者下载整个项目文件)之详细步骤讲解(图…

FLV 封装格式详解

FLV 封装格式详解 FLV 封装格式详解简介FLV 格式FLV headerFLV bodyback-pointerFLV tagFLV tag headerFLV tag data&#xff1a;audio tagFLV tag data&#xff1a;video tagFLV tag data&#xff1a;script tag 总结&#xff1a;FLV 层次结构实例&#xff1a;flvAnalyser 解析…

pytorch演示pipeline并行

pytorch演示pipeline并行 1.单卡内存不够时,可以将网络切分成几段(stage),每个GPU负责一个stage。比如GPU0计算完之后将数据发送给GPU1算后续的stage 2.以上的方式,会导致GPU的利用率不高,可以将输入的batch切分成多份更小的batch,陆续送给GPU0,这样GPU0处理完micro batch0之后…

Anthropic 的 Claude 3 现能从数百个选项中可靠地挑选出合适的工具来完成任务

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

flood_fill 算法|图形渲染

flood fill 算法常常用来找极大连通子图&#xff0c;这是必须掌握的基本算法之一&#xff01; 图形渲染 算法原理 我们可以利用DFS遍历数组把首个数组的值记为color&#xff0c;然后上下左右四个方向遍历二维数组数组如果其他方块的值不等于color 或者越界就剪枝 return 代码…

浮点数在计算机中的存储

这一段代码的输出是什么&#xff1f; int main() {int n 9;float *pFloat (float *)&n;printf("n的值为&#xff1a;%d\n",n);printf("*pFloat的值为&#xff1a;%f\n",*pFloat);*pFloat 9.0;printf("num的值为&#xff1a;%d\n",n);pri…

企业网络安全运营能力的多维度评价及优化策略

网络安全是企业面临的一个日益重要的问题&#xff0c;安全运营能力的强弱直接关系到企业的健康可持续发展和综合竞争力的提升。为推动企业网络安全工作的标准化建设&#xff0c;提升企业的网络安全运营能力&#xff0c;本文从安全建设、安全应对和安全效果三个角度出发&#xf…

如何给MySQL数据库的所有表统一加上字段

在开发过程中&#xff0c;有时候慢慢的建了很多数据库表&#xff0c;但是后来发现需要统一增加某些字段的时候&#xff0c;可以通过alter语句 ALTER TABLE 表名 ADD 列名 数据类型;比如我要给t_user表增加gmt_create与gmt_modified字段&#xff0c;用作记录新增记录时间与更新…

达梦关键字(如:XML,EXCHANGE,DOMAIN,link等)配置忽略

背景&#xff1a;在使用达梦数据库时&#xff0c;查询SQL中涉及XML,EXCHANGE,DOMAIN,link字段&#xff0c;在达梦中是关键字&#xff0c;SQL报关键词不能使用的错误。 解决办法&#xff1a; 配置达梦安装文件E:\MyJava\dmdbms\data\DAMENG\dm.ini 忽略这些关键词&#xff0c;…

CGAL的交叉编译-androidlinux-arm64

由于项目算法需要从Linux移植到android&#xff0c;原先的CGAL库也需要进行移植&#xff0c;先现对CGAL的移植过程做下记录&#xff0c;主要是其交叉编译的过程.。 前提条件&#xff1a; 1、主机已安装NDK编译器&#xff0c;版本大于19 2、主机已安装cmake 和 make 3、主机…

政安晨:【Keras机器学习实践要点】(二十二)—— 基于 TPU 的肺炎分类

目录 简述 介绍 / 布置 加载数据 可视化数据集 建立 CNN 纠正数据失衡 训练模型 拟合模型 可视化模型性能 ​编辑预测和评估结果 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: TensorFlow与Keras机器学习实战 希望政安晨的博客…

达梦(DM)报错[-3209]: 无效的存储参数

[TOC](达梦(DM)报错[-3209]: 无效的存储参数) 最近有一个项目&#xff0c;一直使用的是达梦数据库&#xff0c;今天遇到了一个问题&#xff0c;就是将测试环境新增加的表导入线上时报错 [-3209]: 无效的存储参数&#xff0c;这里我用我本地的达梦数据库复现一下这个问题&#…

【HTML】简单制作一个动态变色光束花

目录 前言 开始 HTML部分 效果图 ​编辑​编辑​编辑​编辑总结 前言 无需多言&#xff0c;本文将详细介绍一段代码&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建一个文本文档&#xff0c;其中HTML的文件名改为[index.html]&a…