抽象工厂模式
如果说昨天的工厂方法是针对单个产品(比如只生产卡车),那么今天的抽象工厂就是针对产品族(比如生产一整套豪华汽车组件,包括豪华车轮、豪华方向盘)。 Day 3:抽象工厂模式 (Abstract Factory Pattern)1. 它是怎么来的?想象一下,你正在开发一款跨平台的 UI 工具包(支持 Windows 和 Mac)。UI 组件有很多种:按钮(Button)、复选框(Checkbox)、文本框(TextField)。 如果你用昨天的工厂方法,你得写一个 ButtonFactory、一个 CheckboxFactory。但这里有一个致命的隐患:你必须确保 Windows 系统上创建的按钮和复选框都是 Windows 风格的,绝对不能在 Mac 系统里误用了一个 Windows 风格的按钮。 这就引入了“产品族”的概念。Windows 的按钮和 Windows 的复选框属于同一个产品族;Mac 的按钮和 Mac...
工厂模式
今天我们来聊一个在实际开发中极度常用,能让你的代码彻底摆脱 if-elif-else 泥潭的经典创建型模式——工厂方法模式(Factory Method Pattern)。 Day 2:工厂方法模式 (Factory Method Pattern)1. 它是怎么来的?在写代码时,我们经常需要创建对象。最直接的方法就是用 new(在 Python 中是 Class())。比如你正在开发一个物流管理系统,刚开始业务简单,只有“卡车”送货,你满脑子都是: 12transport = Truck()transport.deliver() 但很快,业务扩大,客户要求增加“轮船”送货。你不得不去修改原有的代码,加上判断逻辑: 12345if mode == "road": transport = Truck()elif mode == "sea": transport = Ship()#...
单例设计模式
单例模式 (Singleton Pattern)1. 它是怎么来的?在软件开发中,我们经常会遇到一些“只需要一个,多了就会乱套”的资源。比如: 电脑的回收站(你不需要两个回收站,它们会打架)。 数据库连接池(频繁创建和销毁连接非常消耗性能,保持一个全局可复用的连接池更高效)。 应用程序的全局配置(如果每个模块都自己读一份配置,万一中途改了,数据就不一致了)。在过去,程序员们通过全局变量来解决这个问题。但全局变量不仅不安全(容易被不小心覆盖),还破坏了面向对象的封装性。于是,Gang of Four(四人帮,设计模式的奠基者们)提出了单例模式:确保一个类只有一个实例,并提供一个全局访问点。 2. 适用场景 资源共享/控制:如日志记录器(Logger)、线程池、缓存。 统一配置管理:如读取 config.ini 或环境变量的类。 硬件接口访问:如打印机后台处理程序、显卡驱动接口。 3....
JS中的原型及原型链
一、原型链提起 JavaScript 的“原型对象”(Prototype),很多刚入门的小伙伴都会觉得脑子嗡的一下。别慌,我们继续用大白话和生活中的例子来攻克它! 如果说 Property(属性) 是贴在某个具体对象上的标签,那么 Prototype(原型对象) 就是这些对象的“共享模板”或“共享仓库”。 🏭 一个大白话比喻:共享充电宝 / 乐高积木假设你和你的朋友们每人买了一台一模一样的“掌上游戏机”(对象)。 自有属性(Property): 你的游戏机贴了张贴纸,你朋友的游戏机外壳有划痕。这些属于你们各自机器的专属特征。 原型对象(Prototype): 厂家在出厂时,并没有给每台游戏机都内置1000款游戏(因为太占内存空间了)。厂家在云端放了一个“共享游戏库”,所有买这款游戏机的人,都可以通过联网直接玩里面的游戏。 这个“云端共享游戏库”,在 JavaScript 里就叫做 原型对象(Prototype)。 💻 为什么要用原型对象?(解决痛点)我们来看一个实际的代码场景。假设我们要批量制造“小兵”对象: 123456789101112function...
数据库查询优化
数据库查询优化核心思想减少与数据库的通信次数(减少往返),以及减少每次通信的数据量(瘦身) 1. 著名的 “N+1 问题” 与预加载(Relationship Loading)这是所有数据库框架中最经典的性能黑洞。 大白话场景: 你要打印 10 个班级的学生名单。 脑残做法(N+1): 你先去办公室查到了这 10 个班级(1次查询)。然后,你回班级拿第1班的名单,再去办公室;拿第2班的名单,再去办公室……为了 10 个班级,你一共跑了办公室 $10 + 1 = 11$ 次。如果有一万个班级,你的腿就废了(数据库卡死)。 聪明做法(预加载): 你在查 10 个班级的时候,直接跟办公室老师说:“把这 10 个班级里的学生名单顺便一次性都打包给我!”(只跑 1次 办公室)。 SQLAlchemy 的官方解法: 在查询时,使用 options() 明确指定加载策略。 官方提供了三种武器: 武器 A:joinedload()(连表预加载) 原理: 用 SQL 的 LEFT OUTER JOIN 把两张表拼成一张大表,一次性全拿回来。 ...
数据库概览
避坑指南1. 善用“索引(Index)”——查字典的目录 生活场景:给你一本 1000 页的字典,让你找“张三”这个词。如果你从第一页翻到最后一页(这在数据库里叫全表扫描),会累死。但如果你去查字典前几页的拼音目录,就能瞬间定位到在哪一页。 数据库优化:如果你经常需要根据 email 去登录查找用户,那你就必须给 email 这一列加一个“目录”,在数据库里叫索引(Index)。 SQLAlchemy 怎么写?非常简单,在定义列的时候加上 index=True 12# 优化后的写法:给 email 加上索引email: Mapped[str] = mapped_column(String(50), index=True) 注意:目录不是越多越好。字典如果每页都是目录,字典就太厚了。只有经常被当作查询条件的列才加索引。 2. 只拿需要的列,别贪心(避免 SELECT * ) 不好的习惯 123# 这会把用户的所有信息(包括头像、简介、密码等大文本)全部捞出来user = session.execute(select(User).where(User.name...
删除windows下顽固目录
一、背景使用禅道,使用完想要删除,各种限制 二、批处理以管理员身份打开命令提示符: 搜索“cmd”,右键“命令提示符”,选择“以管理员身份运行”。 导航到文件夹所在目录,使用cd命令。例如,如果文件夹在C盘的某个路径下:cd C:\路径\到\文件夹的父目录。 授予所有权:输入 takeown /f 文件名 /r /d y 并回车。(这会将所有权转移到当前管理员。) 授予权限:输入 icacls 文件名 /grant 用户名:F /t 并回车。(授予管理员完全控制权。) 删除文件夹:输入 rd /s /q 文件名 并回车。(/s 删除子目录和文件,/q 安静模式不提示。 三、批处理自动化123456789101112@echo offecho 正在获取所有权...takeown /f "D:\ZenTao" /r /d yecho 正在授予权限...icacls "D:\ZenTao" /grant admin:F /techo...
使用Dockerfile创建镜像
一、概括Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。一般而言,Dockerfile分为四部分: 基础镜像信息、 维护者信息、 镜像操作指令 容器启动时执行指令 123456789101112131415# This Dockerfile uses the ubuntu image# VERSION 2 - EDITION 1# Author: docker_user# Command format: Instruction [arguments / command] ..# Base image to use, this must be set as the first lineFROM ubuntu# Maintainer: docker_user <docker_user at email.com> (@docker_user)MAINTAINER docker_user docker_user@email.com# Commands to update the imageRUN echo "deb...
docker数据管理
一、背景生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。容器中管理数据主要有两种方式: 数据卷(Data Volumes):容器内数据直接映射到本地主机环境; 数据卷容器(Data Volume Containers):使用特定容器维护数据卷。 二、数据卷数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount操作。 数据卷可以提供很多有用的特性,如下所示: 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效方便; 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作; 对数据卷的更新不会影响镜像,解耦了应用和数据; 卷会一直存在,直到没有容器使用,可以安全地卸载它。 2.1 创建数据卷在用docker...
pandas多级表头处理
背景拒绝 MultiIndex 折磨:Pandas 多级表头「拍扁」实战指南在处理银行、财务或政务提供的 Excel 报表时,我们经常会遇到极其复杂的多级表头。虽然 Pandas 的 MultiIndex 功能强大,但在真实项目里,它往往是效率的「杀手」。今天分享一个超实用的技巧:先填充空白占位符,再直接拍扁表头。 一、 为什么要「拍扁」表头?当你直接用 pd.read_excel 读取带有合并单元格的报表时,你会得到类似下面的 MultiIndex:(‘个人客户’, ‘手机银行’, ‘Unnamed: 7_level_2’)这种结构的痛点非常明显: 语义缺失:大量的 Unnamed 占位符让你根本不知道这一列代表什么。 操作繁琐:查询列需要写成 df[(‘层级1’, ‘层级2’, ‘层级3’)],不支持自动补全,极易出错。 兼容性差:如果要将数据存入数据库(MySQL/ClickHouse)或对接可视化工具(Tableau/BI),多级索引往往不被支持。 二、 核心解决方案我们要做的核心逻辑只有两步: 清洗:把 Unnamed...