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

java抽象工厂实战与总结

文章目录

  • 一、工厂模式(三种)
    • 1.简单工厂模式
      • 1.1 概念:
      • 1.2 `使用场景`:
      • 1.3 模型图解:
      • 1.4 伪代码:
    • 2.工厂方法模式
      • 2.1 概念:
      • 2.2 `使用场景`:
      • 2.3 模型图解:
      • 2.4 伪代码
    • 3.抽象工厂模式
      • 3.1 概念
      • 3.2 `使用场景`
      • 3.3 模型图解:以两层模型做例子
      • 3.4 伪代码
      • 3.4.1 以品牌角度设计工厂
      • 3.4.2 以手机角度设计工厂
      • 3.5 实战:抽象工厂 + 简单工厂模式 +策略模式
        • 3.5.1 业务方法调用
        • 3.5.2 抽象工厂创建二级工厂,定义获取业务对象接口(二级工厂去创建具体的业务对象)
        • 3.5.3 二级工厂 获得对象
        • 3.5.3 二级工厂 具体的业务对象
        • 3.5.3 处理的业务
    • 补充:6大设计原则
    • 3.6 总结:


一、工厂模式(三种)

1.简单工厂模式

1.1 概念:

通过一个工厂类来创建对象,根据不同的参数或条件返回相应的对象实例。
隐藏了对象的创建细节,客户端只需通过工厂类获取对象而不需要直接实例化对象。

1.2 使用场景

使用者:根据不同的参数或条件返回相应的对象实例

1.3 模型图解:

角色:手机总工厂、参数、手机、小米手机、华为手机
后续补充:

1.4 伪代码:

public class SimpleFactoryTest {static class SimpleFactory {static SimpleFactoryTest.Mobile createMobile(int mobileType) throws Exception {if (mobileType == 1) {return new SimpleFactoryTest.HuaWei();} else if (mobileType == 2) {return new SimpleFactoryTest.XiaoMi();} else {throw new Exception("手机类型不存在!!!");}}}public static class Mobile {protected void call() {System.out.println("mobile...");}}public static class HuaWei extends Mobile {public void call() {System.out.println("huaWei...");}}public static class XiaoMi extends Mobile {public void call() {System.out.println("xiaomi...");}}public static void main(String[] args) throws Exception {SimpleFactoryTest.Mobile mobile = SimpleFactory.createMobile(1);mobile.call();}
}

2.工厂方法模式

2.1 概念:

定义了一个创建对象的接口,具体对象的创建由对象工厂决定。
使得对象的创建延迟到子类工厂,从而实现了对扩展开放、对修改关闭的原则。

2.2 使用场景

使用者:根据不同的子工厂创建相应的对象实例

2.3 模型图解:

角色:手机总工厂、小米手机工厂、华为手机工厂、手机、小米手机、华为手机
后续补充

2.4 伪代码

public class FactoryMethodTest {interface FactoryMethod {Mobile createMobile();}static class HuaweiFactory implements FactoryMethod {@Overridepublic Mobile createMobile() {return new Huawei();}}static class XiaomiFactory implements FactoryMethod {@Overridepublic Mobile createMobile() {return new Xiaomi();}}static class Mobile {protected void call() {System.out.println("mobile...");}}static class Huawei extends Mobile {@Overridepublic void call() {System.out.println("huawei...");}}static class Xiaomi extends Mobile {@Overridepublic void call() {System.out.println("xiaomi...");}}public static void main(String[] args) {final HuaweiFactory huaweiFactory = new HuaweiFactory();final Mobile mobile = huaweiFactory.createMobile();mobile.call();}
}

3.抽象工厂模式

3.1 概念

抽象工厂模式提供一个接口,用于创建一系列相关或相互依赖的对象。
通过使用抽象工厂及其产品接口来创建对象,从而将客户端与具体的产品实现解耦。

3.2 使用场景

适用:三层关系

产品品牌子品牌
手机华为手机Mate60 / P60手机 …等
手机小米手机红米 / Note2 手机 … 等

适用:两层关系

产品品牌
手机华为
电脑小米

3.3 模型图解:以两层模型做例子

角色::总工厂、小米工厂、华为工厂、小米手机、华为手机、小米路由器、华为路由器

3.4 伪代码

3.4.1 以品牌角度设计工厂


/*** descr: 以品牌角度设计工厂** @date: 2024/1/24**/
public interface AbstractFactory {Phone createPhone();Computer createComputer();class HuaweiFactory implements AbstractFactory {@Overridepublic Phone createPhone() {return new HuaweiPhone();}@Overridepublic Computer createComputer() {return new HuaweiComputer();}}class XiaomiFactory implements AbstractFactory {@Overridepublic Phone createPhone() {return new XiaomiPhone();}@Overridepublic Computer createComputer() {return new XiaomiComputer();}}class HuaweiPhone implements Phone {@Overridepublic void call() {System.out.println("huawei call...");}}class HuaweiComputer implements Computer {@Overridepublic void play() {System.out.println("huawei play...");}}class XiaomiPhone implements Phone {@Overridepublic void call() {System.out.println("xiaomi play...");}}class XiaomiComputer implements Computer {@Overridepublic void play() {System.out.println("xiaomi play...");}}interface Phone {void call();}interface Computer {void play();}
}

3.4.2 以手机角度设计工厂

代码目录结构:
目录结构
1.测试类 及常量类
1.1 测试类

/*** descr** @author: bjh* @date: 2024/1/27**/
public class AbstractFactoryTest {public static void main(String[] args) {doBiz(Constant.BRAND_HUAWEI, Constant.MODEL_HUAWEI_MATE60);doBiz(Constant.BRAND_XIAOMI, Constant.MODEL_XIAOMI_K20);}/*** 业务方法:** @param brand     品牌* @param modelName 机型*/public static void doBiz(String brand, String modelName) {final AbstractFactory factory = AbstractFactory.getFactory(brand);final Phone phone = factory.createPhone(modelName);phone.call();}}

1.2 常量类

/*** descr:便于管理和维护魔法值** @author: bjh* @date: 2024/1/27**/
public interface Constant {String BRAND_HUAWEI = "huawei";String BRAND_XIAOMI = "xiaomi";String MODEL_HUAWEI_MATE60 = "mate60";String MODEL_HUAWEI_P20 = "p20";String MODEL_XIAOMI_K20 = "k20";
}

2.抽象工厂


/*** descr: 抽象总工厂;* 1.采用简单工厂方法模式获得二级工厂* 2.定义创建手机的接口方法** @author: bjh* @date: 2024/1/26**/
public abstract class AbstractFactory {public abstract Phone createPhone(String modalName);public static AbstractFactory getFactory(String brand) {// 此处三木运算符使用不严谨,实际编码不建议这样写return Constant.BRAND_HUAWEI.equals(brand) ? new HuaweiPhoneFactory() : new XiaomiPhoneFactory();}
}

3.二级工厂(实际工厂)
3.1 华为手机工厂

/*** descr: 华为手机工厂,生成华为手机** @author: bjh* @date: 2024/1/27**/
public class HuaweiPhoneFactory extends AbstractFactory {@Overridepublic Phone createPhone(String modalName) {// 此处三木运算符使用不严谨,实际编码不建议这样写return Constant.MODEL_HUAWEI_MATE60.equals(modalName) ? new Mate60Phone() : new P20Phone();}
}

3.2 小米手机工厂


/*** descr** @author: bjh* @date: 2024/1/27**/
public class XiaomiPhoneFactory extends AbstractFactory {@Overridepublic Phone createPhone(String modalName) {// 此处写法不严谨,实际编码不建议这样写return new K20Phone();}
}

4.抽象手机


/*** descr:手机产品** @author: bjh* @date: 2024/1/26**/
public abstract class Phone {// 机型名称protected String modelName;// 是否支持卫星通话:小米不支持,华为支持protected Boolean satellitePhone;// 公有业务方法:策略模式abstract public void call();
}

5.华为抽象手机与小米抽象手机
5.1 华为抽象手机

/*** descr:抽象的华为手机,定义华为手机特有的业务** @author: bjh* @date: 2024/1/26**/
public abstract class HuaweiPhone extends Phone {// 定义华为手机相关业务: 拨打卫星电话protected abstract void callSatellite();// 支持卫星电话private Boolean satellitePhone = true;
}

5.2 小米抽象手机

/*** descr:抽象的小米手机,定义小米手机特有的业务** @author: bjh* @date: 2024/1/26**/
public abstract class XiaomiPhone extends Phone {//小米手机便宜protected String cheap = "有点便宜!";//不支持卫星电话private Boolean satellitePhone = false;
}
  1. 实际手机产品:mate60、p20、k20
    6.1 mate60

/*** descr 实际华为产品:mate60** @author: bjh* @date: 2024/1/27**/
public class Mate60Phone extends HuaweiPhone {private String modelName = "华为mate60";@Overridepublic void call() {System.out.println(this.modelName + "拨打电话...");}@Overrideprotected void callSatellite() {System.out.println(this.modelName + " >> 拨打卫星电话");}
}

6.2 p20


/*** descr 实际华为产品:P20** @author: bjh* @date: 2024/1/27**/
public class P20Phone extends HuaweiPhone {private String modelName = "华为P20";@Overridepublic void call() {System.out.println(this.modelName + "拨打电话...");}@Overrideprotected void callSatellite() {System.out.println(this.modelName + ">> 拨打卫星电话");}
}

6.3 k20


/*** descr 实际小米产品:K20** @author: bjh* @date: 2024/1/27**/
public class K20Phone extends XiaomiPhone {private String modelName = "小米K20";@Overridepublic void call() {// 抽取变量提高代码可维护性,HashMap源码中有类似这样写法String modalName = this.modelName;System.out.println(modalName + super.cheap);System.out.println(modalName + "拨打电话...");}
}

3.5 实战:抽象工厂 + 简单工厂模式 +策略模式

代码目录结构:
目录结构

3.5.1 业务方法调用
/*** 根据业务类型计算真正需要动账的存欠类型** @param materialInboundDO* @param walletTypeAndWeight* @return*/private Map<String, BigDecimal> doBizType(MaterialInboundDO materialInboundDO, Map<String, BigDecimal> walletTypeAndWeight) {final AbstractFactory factory = AbstractFactory.getFactory(materialInboundDO.getBillType());final MaterialWalletHandler materialInboundBean = factory.getMaterialInboundOutboundBean(materialInboundDO.getBizType());return materialInboundBean.doBizType(walletTypeAndWeight);}
3.5.2 抽象工厂创建二级工厂,定义获取业务对象接口(二级工厂去创建具体的业务对象)
/*** 抽象工厂解决供应商/客户来料不同的业务类型对客户钱包的动账变化** @date: 2023/7/18**/
public abstract class AbstractFactory {/*** 获得单据类型工厂** @param billType 单据类型* @return*/public static AbstractFactory getFactory(String billType) {if (BillTypeEnum.MATERIAL_CUSTOMER_IN.getKey().equals(billType)) {return new InboundCustomerFactory();} else if ( BillTypeEnum.MATERIAL_SUPPLIER_IN.getKey().equals(billType)) {return new InboundSupplierFactory();}  else if (BillTypeEnum.MATERIAL_CUSTOMER_OUT.getKey().equals(billType)) {return new OutboundCustomerFactory();}  else if (BillTypeEnum.MATERIAL_SUPPLIER_OUT.getKey().equals(billType)) {return new OutboundSupplierFactory();}throw new ServiceException("原料业务工厂不存在");}/*** 获得业务对象** @param bizType 业务类型* @return*/public abstract MaterialWalletHandler getMaterialInboundOutboundBean(String bizType);
}
3.5.3 二级工厂 获得对象
/*** descr 客户来料工厂** @date: 2023/7/18**/
public class InboundCustomerFactory extends AbstractFactory {@Overridepublic InboundCustomerHandler getMaterialInboundOutboundBean(String bizType) {if (BizTypeEnum.M_CUSTOMER_IN.getKey().equals(bizType)) {return new InboundCustomerIn();}throw new ServiceException("客户来料业务类型不存在");}
}
3.5.3 二级工厂 具体的业务对象
/*** descr 客户:客户来料** @date: 2023/7/18**/
public class InboundCustomerIn implements InboundCustomerHandler {@Overridepublic Map<String, BigDecimal> doBizType(Map<String, BigDecimal> walletTypeAndWeight) {return walletTypeAndWeight;}
}
3.5.3 处理的业务

顶层接口,如下子业务处理方式

/*** descr 来料/出料业务定义接口** @date: 2023/7/18**/
public interface MaterialWalletHandler {Map<String, BigDecimal> doBizType(Map<String, BigDecimal> walletTypeAndWeight);}

在这里插入图片描述

中间层子接口之一:用于规范业务

/*** descr 客户来料接口** @date: 2023/7/18**/
public interface InboundCustomerHandler extends MaterialWalletHandler {}

中间层接口实现1:用于处理业务

/*** descr 客户:客户来料** @date: 2023/7/18**/
public class InboundCustomerIn implements InboundCustomerHandler {@Overridepublic Map<String, BigDecimal> doBizType(Map<String, BigDecimal> walletTypeAndWeight) {return walletTypeAndWeight;}
}

中间层接口实现2:用于处理业务

/*** descr 供应商:发料兑料** @date: 2023/7/18**/
public class OutboundSupplierMix implements OutboundSupplierHandler {@Overridepublic Map<String, BigDecimal> doBizType(Map<String, BigDecimal> walletTypeAndWeight) {final HashMap<String, BigDecimal> walletTypeAndWeightMap = new HashMap<>(walletTypeAndWeight);walletTypeAndWeightMap.remove(WalletTypeEnum.CASH.getKey());return walletTypeAndWeightMap;}
}

补充:6大设计原则

1.单一职责
2.开放封闭
3.接口隔离
4.里氏替换
5.依赖倒置
6.迪米特法则

转送:java常用设计模式

3.6 总结:

  1. 以上实战中,代码没有写的很完美,还有许多改善的地方
  2. 抽象工厂在实际运用中比一般都例子都相对复杂;或可能写的理解的有所欠缺
  3. 抽象工厂定义了对象怎么创建;策略模式定义了业务怎么实现
  4. 一般抽象工厂模式都想要依托简单工厂或工厂方法模式创建二级工厂;在实践中一般会搭配策略模式或模板方法模式去处理相关业务
  5. 设计模式的使用主要是对业务代码进行简化或抽象,尽量符合6大设计原则;在技术人员沟通中,只要说出某种设计模式,就能知道业务大概是怎么处理的,极大的减少了沟通成本

相关文章:

java抽象工厂实战与总结

文章目录 一、工厂模式&#xff08;三种&#xff09;1.简单工厂模式1.1 概念&#xff1a;1.2 使用场景&#xff1a;1.3 模型图解&#xff1a;1.4 伪代码&#xff1a; 2.工厂方法模式2.1 概念&#xff1a;2.2 使用场景&#xff1a;2.3 模型图解&#xff1a;2.4 伪代码 3.抽象工厂…...

Compose | UI组件(六) | 选择框

文章目录 前言Checkbox 复选框的含义Checkbox 复选框的使用Switch 单选框的含义Switch 单选框的使用Slider 滑竿组件的含义Slider 滑竿组件的使用 总结 前言 随着移动端的技术不断更新迭代&#xff0c;Compose也运用的越来越广泛&#xff0c;很多人都开始学习Compose 本文主要…...

C++拷贝构造函数、赋值学习整理:

拷贝构造函数&#xff1a; 概念&#xff1a; 构造函数的第一个参数&#xff0c;是类本身的const引用&#xff08;一般情况下没有其他参数&#xff0c;少数情况&#xff1a;其他参数必须有默认值&#xff01;&#xff09;称此类构造函数为拷贝构造函数 特征&#xff1a; 1&am…...

[亲测源码]ps软件网页版在线使用 PS网站程序源码 photoshop网页版源码 网页版的ps软件源码

在线PS作图修图网页版PHP网站源码&#xff0c;PHP在线照片图片处理PS网站程序源码photoshop网页版。 有很多朋友们都是在用PS作图的&#xff0c;众所周知在使用和学习PS时是需要下载软件的&#xff0c;Photoshop软件对电脑配置也是有一定要求的&#xff0c;今天就为大家带来一…...

前端大厂面试题探索编辑部——第二期

目录 题目 单选题1 题解 关于TCP 关于UDP 单选题2 题解 A选项的HTTP是否是无状态协议 B选项的HTTP支持的方法 C选项的关于HTTP的状态码 D选项HTTP协议的传输格式 题目 单选题1 1.以下哪个描述是关于 TCP 和 UDP 的区别&#xff08;&#xff09; A. TCP 是无连接的…...

yaml学习笔记

文章目录 yaml语言学习yaml 简介yaml 和json 区别基本语法数据类型YAML 对象YAML 数组锚点和引用纯量 参考文档 yaml语言学习 最近发现在学习k8s中各种配置文件 都是使用的yaml 这种格式, 包括 docker-compose.yaml 也都是用这个格式配置部署项目信息,我就了解了一下这个语法就…...

深度强化学习(王树森)笔记04

深度强化学习&#xff08;DRL&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接&#xff1a;https://github.com/wangshusen/DRL 源代码链接&#xff1a;https://github.c…...

openssl3.2/test/certs - 074 - CT entry

文章目录 openssl3.2/test/certs - 074 - CT entry概述笔记setup074.shsetup074_sc1.shsetup074_sc2.shsetup074_sc3.shEND openssl3.2/test/certs - 074 - CT entry 概述 openssl3.2 - 官方demo学习 - test - certs 笔记 setup074.sh #! /bin/bash# \file setup074.sh# o…...

Angular组件(一) 分割面板ShrinkSplitter

Angular组件(一) 分割面板ShrinkSplitter 前言 分割面板在日常开发中经常使用&#xff0c;可将一片区域&#xff0c;分割为可以拖拽整宽度或高度的两部分区域。模仿iview的分割面板组件&#xff0c;用angular实现该功能&#xff0c;支持拖拽和[(ngModel)]双向绑定的方式控制区…...

抖音详情API:视频内容获取与解析技巧

一、引言 抖音是一款广受欢迎的短视频分享平台&#xff0c;每天都有大量的用户在抖音上分享自己的生活点滴和创意作品。对于开发者而言&#xff0c;如何获取并解析抖音上的视频内容&#xff0c;是一项极具挑战性的任务。本文将详细介绍抖音详情API&#xff0c;以及如何使用它来…...

SpringBoot中实现阿里云OSS对象存储

背景 在业务中我们往往需要上传文件如图片&#xff0c;文件上传&#xff0c;是指将本地图片、视频、音频等文件上传到服务器上&#xff0c;可以供其他用户浏览或下载的过程。文件上传在项目中应用非常广泛&#xff0c;我们经常发抖音、发朋友圈都用到了文件上传功能。 实现文件…...

大型语言模型 (LLM)全解读

一、大型语言模型&#xff08;Large Language Model&#xff09;定义 大型语言模型 是一种深度学习算法&#xff0c;可以执行各种自然语言处理 (NLP) 任务。 大型语言模型底层使用多个转换器模型&#xff0c; 底层转换器是一组神经网络。 大型语言模型是使用海量数据集进行训练…...

Unity - gamma space下还原linear space效果

文章目录 环境目的环境问题实践结果处理要点处理细节【OnPostProcessTexture 实现 sRGB 2 Linear 编码】 - 预处理【封装个简单的 *.cginc】 - shader runtime【shader需要gamma space下还原记得 #define _RECOVERY_LINEAR_IN_GAMMA】【颜色参数应用前 和 颜色贴图采样后】【灯…...

Rabbitmq调用FeignClient接口失败

文章目录 一、框架及逻辑介绍1.背景服务介绍2.问题逻辑介绍 二、代码1.A服务2.B服务3.C服务 三、解决思路1.确认B调用C服务接口是否能正常调通2.确认B服务是否能正常调用A服务3.确认消息能否正常消费4.总结 四、修改代码验证1.B服务异步调用C服务接口——失败2.将消费消息放到C…...

专业120+总分400+海南大学838信号与系统考研高分经验海大电子信息与通信

今年专业838信号与系统120&#xff0c;总分400&#xff0c;顺利上岸海南大学&#xff0c;这一年的复习起起伏伏&#xff0c;但是最后还是坚持下来的&#xff0c;吃过的苦都是值得&#xff0c;总结一下自己的复习经历&#xff0c;希望对大家复习有帮助。首先我想先强调一下专业课…...

如何区分 html 和 html5?

HTML&#xff08;超文本标记语言&#xff09;和HTML5在很多方面都存在显著的区别。HTML5是HTML的最新版本&#xff0c;引入了许多新的特性和元素&#xff0c;以支持更丰富的网页内容和更复杂的交互。以下是一些区分HTML和HTML5的关键点&#xff1a; 新特性与元素&#xff1a;H…...

Ps:将文件载入堆栈

Ps菜单&#xff1a;文件/脚本/将文件载入堆栈 Scripts/Load Files into Stack 将文件载入堆栈 Load Files into Stack脚本命令可用于将两个及以上的文件载入到同一个 Photoshop 新文档中。 载入的每个文件都将成为独立的图层&#xff0c;并使用其原始文件名作为图层名。 Photos…...

【格密码基础】:补充LWE问题

目录 一. LWE问题的鲁棒性 二. LWE其他分布选择 三. 推荐文献 四. 附密码学人心中的顶会 一. LWE问题的鲁棒性 robustness&#xff0c;翻译为鲁棒性 已有的论文表明&#xff0c;及时敌手获取到部分关于秘密和error的信息&#xff0c;LWE问题依旧是困难的&#xff0c;这能…...

【C++入门到精通】特殊类的设计 |只能在堆 ( 栈 ) 上创建对象的类 |禁止拷贝和继承的类 [ C++入门 ]

阅读导航 引言一、特殊类 --- 不能被拷贝的类1. C98方式&#xff1a;2. C11方式&#xff1a; 二、特殊类 --- 只能在堆上创建对象的类三、特殊类 --- 只能在栈上创建对象的类四、特殊类 --- 不能被继承的类1. C98方式2. C11方法 总结温馨提示 引言 在面向对象编程中&#xff0…...

VMware虚拟机部署Linux Ubuntu系统

本文介绍基于VMware Workstation Pro虚拟机软件&#xff0c;配置Linux Ubuntu操作系统环境的方法。 首先&#xff0c;我们需要进行VMware Workstation Pro虚拟机软件的下载与安装。需要注意的是&#xff0c;VMware Workstation Pro软件是一个收费软件&#xff0c;而互联网中有很…...

Workbench与Ls-Dyna中位移与远程位移设置的关键字映射解析

1. 固定支撑的关键字映射与实战配置 在有限元分析中&#xff0c;固定支撑是最基础的边界条件之一。Workbench和Ls-Dyna对固定支撑的实现逻辑完全不同&#xff0c;但最终达到的约束效果是等效的。先看Workbench端的操作&#xff1a;在Mechanical界面右键选择Ls-Dyna环境&#xf…...

WSABuilds GitHub Actions构建流程解析:自动化CI/CD管道配置

WSABuilds GitHub Actions构建流程解析&#xff1a;自动化CI/CD管道配置 【免费下载链接】WSABuilds Run Windows Subsystem For Android on your Windows 10 and Windows 11 PC using prebuilt binaries with Google Play Store (MindTheGapps) and/or Magisk or KernelSU (ro…...

K8s Ingress实战:如何为静态资源开启Gzip压缩和Cache Control(附完整ConfigMap配置)

Kubernetes Ingress高级配置&#xff1a;静态资源Gzip压缩与缓存策略实战指南 在当今快节奏的数字化体验中&#xff0c;网页加载速度直接影响用户留存率和转化率。根据行业研究&#xff0c;页面加载时间每增加1秒&#xff0c;可能导致转化率下降7%。作为Kubernetes运维专家&…...

为什么AI Coding、Skills、Agent智能体都偏爱Markdown?

为什么AI Coding、Skills、Agent智能体都偏爱Markdown&#xff1f; 更多问题讨论和资料获取&#xff0c;请关注文章最后的微信公众号 从ChatGPT的输出到GitHub Copilot的提示&#xff0c;从Claude的记忆存储到智能体的工作流配置——Markdown无处不在。这不是巧合&#xff0c;…...

高效获取数字资源工具:Internet Archive下载器全方位应用指南

高效获取数字资源工具&#xff1a;Internet Archive下载器全方位应用指南 【免费下载链接】internet_archive_downloader A chrome/firefox extension that download books from Internet Archive(archive.org) and HathiTrust Digital Library (hathitrust.org) 项目地址: h…...

XC6206-1.8V是什么?有哪些作用?

本文主要介绍XC6206-1.8V是什么&#xff1f;有哪些作用&#xff1f;XC6206-1.8V是一款超低功耗、高精度的固定输出低压差线性稳压器&#xff08;LDO&#xff09;&#xff0c;核心作用是把较高电压转换成稳定的1.8V输出&#xff0c;专门为电池供电和低功耗设备设计。图文来源&am…...

Trae平台实战:我如何教会一个AI智能体应对动态网页和反爬虫?

Trae平台实战&#xff1a;动态网页抓取与反爬策略的智能应对之道 在数据驱动的商业环境中&#xff0c;网页抓取技术已成为企业获取竞争优势的关键能力。然而&#xff0c;随着网站防护技术的升级&#xff0c;传统爬虫在面对动态加载内容和复杂反爬机制时往往力不从心。本文将分享…...

用了Trae写业务系统,为什么上线前总要手动补依赖和权限?

发版前夜&#xff0c;测试跑穿才发现前端字段跟后端对不上&#xff0c;改到凌晨三点才勉强收口。这种场景在引入 AI Coding 后并不罕见&#xff0c;不少团队用了 Trae 写业务系统&#xff0c;速度是上去了&#xff0c;可上线前总得花半天专门查安全漏洞和依赖冲突。大家原指望 …...

FanControl终极指南:如何在Windows上实现专业级风扇控制与噪音优化[特殊字符]

FanControl终极指南&#xff1a;如何在Windows上实现专业级风扇控制与噪音优化&#x1f525; 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitco…...

手把手教你学Simulink——基于Simulink的同步整流Buck变换器效率提升仿真

目录 手把手教你学Simulink——基于Simulink的同步整流Buck变换器效率提升仿真​ 摘要​ 一、背景与挑战​ 1.1 传统二极管整流的效率瓶颈​ 1.1.1 二极管损耗机理​ 1.2 同步整流的优势与挑战​ 1.2.1 同步整流原理​ 1.2.2 核心挑战​ 1.3 设计目标​ 二、系统架构与…...