设计模式之建造者模式(Builder Pattern)
建造者模式(Builder Pattern)前言在日常软件开发中,我们经常面对这样的场景:需要组合多个零件来生成一个复杂对象,而且组合方式多种多样。如果用 if-else 硬编码堆砌,代码将变得又长又难维护——这正是”面条代码”的典型特征。
建造者模式(Builder Pattern)就是解决这类问题的利器。本文以装修套餐选择系统为背景,通过面条代码与建造者模式的对比,深入理解该模式的价值所在。
本文实战代码链接:codedesign2.0
参考博客:重学 Java 设计模式:实战建造者模式「各项装修物料组合套餐选配场景」 | 小傅哥 bugstack 虫洞栈
一、核心定义建造者模式(Builder Pattern)是一种创建型设计模式,将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
核心思想:
把构建步骤标准化(接口约定),但每一步具体用什么材料可以灵活替换
链式调用(Fluent Interface) 让调用侧代码高度可读
Director(指挥者) 封装不同预设方案,屏蔽内部组合细节
与工厂模式的区别:工厂关注”创建哪类对象”,建造者 ...
java中的return this和链式编程
java中的return this和链式编程前言在阅读优秀的开源框架(如 MyBatis、Lombok 生成的 Builder 类)或现代 Java 代码时,我们经常会看到这种如同流水线一般一气呵成的代码:
123456// 让人极度舒适的链式调用Person person = new PersonBuilder() .setName("张三") .setAge(18) .setCity("北京") .build();
这种 对象.方法().方法().方法() 的写法被称为链式编程(Method Chaining)。它不仅让代码可读性飙升,还极大地减少了代码行数。
而背后实现方式,仅仅是一句简单的:return this;。
一、 没有 return this 的世界假设我们有一个 CoffeeMaker(咖啡机)类,我们需要加冰、加糖、加奶,传统的写法如下:
123456// 1. 传统的无返 ...
java中BigDecimal 讲解
BigDecimal讲解前言在 Java 开发中,涉及到金额计算、财务系统、电商报价等对数字精度要求极高的场景时,double 和 float 往往会成为制造 Bug 的罪魁祸首。
此时,就会使用这个类 —— BigDecimal。
为什么不能用 double 算钱?
代码如下:
12345System.out.println(0.1 + 0.2); // 输出结果: 0.30000000000000004System.out.println(1.0 - 0.9); // 输出结果: 0.09999999999999998
原因解析: 计算机底层使用二进制表示浮点数,而许多十进制小数(如 0.1)在二进制中是无限循环小数。double 会在某一位截断,从而导致精度丢失。在商业计算中,差一分钱也是极其严重的生产事故。
为了解决这个问题,Java 提供了 java.math.BigDecimal,专用于高精度计算。
一、 创建BigDecimal对象创建 BigDecimal 对象时,最容易踩进“精度丢失”的二次陷阱。
1.1 错误用法123BigDecimal bad = new B ...
设计模式之抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern)前言工厂方法管单品,抽象工厂管配套。它是保证“产品族”生态一致性的标准解法,能有效杜绝组件混搭。
参考博客:抽象工厂设计模式
一、核心定义抽象工厂模式是一种创建型设计模式,它提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。
与工厂方法模式的核心区别:
工厂方法:一个工厂创建一种产品(如 createButton())
抽象工厂:一个工厂创建一族产品(如 createButton() + createCheckbox())
关键词
解释
产品族
同一平台/风格下的一组产品,如 Windows 按钮 + Windows 复选框
产品等级
同一类型产品的不同实现,如 Windows 按钮 vs MacOS 按钮
族内一致性
抽象工厂保证同一工厂生产的产品一定是同一风格,不会出现 Windows 按钮配 MacOS 复选框
二、标准体系结构图(UML)
四个角色:抽象工厂、具体工厂、抽象产品、具体产品。客户端只依赖两层抽象。
三、场景推演:从“单品生 ...
设计模式之工厂方法模式(Factory Method Pattern)
工厂方法模式(Factory Method Pattern)前言简单工厂模式虽然初步实现了对象创建与使用的分离,但其内部臃肿的 if-else 逻辑却成为了系统扩展时的痛点,严重违背了开闭原则(OCP)。
如何优雅地打破这种“上帝类”的束缚?工厂方法模式(Factory Method Pattern) 给出了标准答案:利用多态,将对象的实例化彻底延迟到子类中进行。
参考博客:工厂方法设计模式
一、核心定义在简单工厂模式中,所有的创建逻辑都集中在一个“上帝工厂类”里(充满了 if-else 或 switch-case)。
痛点:一旦新增产品(比如新增华为手机),就必须修改这个工厂类的源代码,这严重违背了开闭原则(Open-Closed Principle, OCP)——对扩展开放,对修改封闭。
工厂方法模式通过“多态”解决了这个问题:==将对象的实例化推迟到子类中进行。==
核心思想是:定义一个创建对象的接口(抽象工厂),但让实现这个接口的类(具体工厂)来决定实例化哪个类(具体产品)。
核心思想:不直接 new 对象,而是通过工厂子类来决 ...
关于三个工厂设计模式总结
关于工厂的设计模式总结前言简单工厂:只能提供一个工厂生产一种产品;
工厂方法:可以提供多个工厂生产一种产品;
抽象工厂:一个工厂可生产多种产品且可以提供多个工厂。
图片来源b站视频和评论区:《重学Java设计模式》第5章 抽象工厂模式_哔哩哔哩_bilibili
一、 简单工厂模式 (Simple Factory)场景设定:你拥有一家全能小作坊。根据客户的指令,这家作坊既能做苹果手机,也能做小米手机。
1.1 代码实现12345678910111213141516171819202122232425262728293031// 1. 先规定什么是手机(产品接口)public interface Phone { void make(); // 制造手机}// 2. 具体的手机产品public class IPhone implements Phone { public void make() { System.out.println("制造了一台苹果手机"); }} ...
设计模式之简单工厂设计模式
简单工厂设计模式前言在日常开发中,当我们需要根据不同参数创建不同对象时,代码很容易变成一堆 if-else 的“面条代码”。
**简单工厂模式(Static Factory Method)**正是为了解决这个问题而生:它把所有对象的创建逻辑集中到一个“大工厂”里,让调用方只需要传入一个类型参数,就能拿到统一的接口对象,无需关心具体是哪一个实现类。
本文从简单工厂模式的核心定义与UML结构出发,以两个场景对比“面条代码”与“简单工厂”两种写法:
LLM模型网关路由;
营销发奖系统(优惠券、实物商品、爱奇艺卡三种不同发放逻辑)。
一、 核心定义简单工厂模式又叫做静态工厂方法模式(Static Factory Method)。
它的核心思想是:由一个专门的“大工厂”类,根据传入的参数,集中包含所有具体对象的创建逻辑,并返回它们的通用接口。
打个比方:简单工厂就像是一个全能的“自动售货机”,你按 1,它给你掉下来可乐;你按 2,它给你掉下来雪碧。售货机(工厂)内部自己搞定了所有的判断逻辑。
二、 标准体系结构图 (UML)角色说明:
抽象产品(Product):定义规范,java中通常 ...
IDEA中创建和运行java项目的常见技巧
IDEA中创建和运行java项目的常见技巧一、创建maven模块1.1 如何创建maven模块
文件或者项目根目录 -> new -> Module
在new module部分配置好:模块名、语言和框架、JDK选择、GAV坐标,然后点击creat:
1.2 理解IDEA中maven模块界面
新建模块之后的目录结构以及maven识别模块成功后的界面如图所示:
模块的pom.xml配置
pom.xml是“户口本”:maven管理依赖的配置文件pom.xml,标识本模块的名字和需要的依赖,方便自动引入以及打包;
GAV 坐标:(GroupId:组织名,ArtifactId:项目名,Version:版本号),在全网唯一确定你的项目身份,(如 com.likerhood.design:codedesign1.0-1:1.0-SNAPSHOT),为你后续使用 Maven 自动管理和下载依赖包打下基础。
项目如果打包发布,生成的包名默认就是 codedesign1.0-1.jar
123456789101112<?xml version="1.0& ...
java中==和.equals()区别
java中==和.equals()区别前言这是一个 Java 领域经典的基础问题。
一句话核心区别:
== 比较的是“是不是同一个东西”(内存地址),.equals() 比较的是“长得一不一样”(内容/数值)。
Java 内存可以将其简单分为两块:
栈内存(Stack): 存放基本数据类型的值,以及对象变量的“引用地址”(可以理解为开门的钥匙)。
堆内存(Heap): 使用 new 关键字创建的具体对象(可以理解为具体的房子),存放在这里。
一、 核心概念:物理地址 vs 逻辑内容1.1 == 操作符:物理视角的“唯一性”== 是 Java 的原生运算符,它执行的是最底层的“位比对”。
基本数据类型:比较的是值。
引用数据类型:比较的是内存地址(即堆内存中的物理位置)。
1.2 .equals() 方法:逻辑视角的“相似性”.equals() 是 java.lang.Object 类中定义的成员方法。
默认逻辑:如果类没有重写该方法,其源代码内部依然是使用 == 进行比较。
重写逻辑:Java 官方类(如 String, Integer ...
使用 Hexo + GitHub Pages 搭建个人静态博客
使用 Hexo + GitHub Pages 搭建个人静态博客前言GitHub Pages 是 GitHub 提供的免费静态页面托管服务,配合 Hexo 这个快速、简洁的静态博客框架,可以零成本搭建一个属于自己的技术博客。全程不需要购买服务器,只需要熟悉基本的命令行操作。
一、环境准备1.1 安装 Node.js(使用 nvm 管理版本)推荐使用 nvm 安装 Node.js,便于后续版本管理(可参考《使用 nvm 安装 Node.js》)。
1234nvm install 22.15.0nvm use 22.15.0node -v # 验证安装成功npm -v
1.2 安装 Git
Windows 用户前往 git-scm.com 下载安装。
安装后验证:
1git --version
1.3 配置 Git 全局信息12git config --global user.name "你的用户名"git config --global user.email "你的邮箱"
二、注册并配置 GitHub2.1 注册 GitHub 账号前 ...









