Photo by Lorem Ipsum
852 words
4 minutes
设计模式系列(五):代码落地核心要点
设计模式系列
Posts in this series (7)AI 智能总结
设计模式 5 代码落地核心要点
理论模式最终要落地工程编码,本节聚焦多语言实现差异、线程安全单例、如何规避过度设计,结合实例说明开发实操准则。
一、语言实现差异:Java / Go / Python
设计模式是思想,不同语言语法特性会改变实现写法,不能直接照搬代码。
Java
- 依托接口、抽象类、访问权限修饰符实现;
- 强面向对象,继承、静态类、私有构造广泛使用;
- 动态代理依赖 JDK 接口代理 / CGLib;
- 典型:单例依靠私有构造器防止外部实例化。
// Java 饿汉单例public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton(){} public static Singleton getInstance(){return INSTANCE;}}Go
- 无类、无继承;依靠结构体+接口(隐式实现)、组合;
- 没有构造函数,使用 NewXXX 构造方法;
- 单例常用
sync.Once保证并发安全。
package mainimport "sync"var once sync.Oncevar instance *Singletontype Singleton struct{}func GetInstance() *Singleton { once.Do(func() { instance = &Singleton{} }) return instance}Python
- 动态语言,无严格访问控制(没有真正私有);
- 支持元类、装饰器语法糖,实现模式非常简洁;
- 猴子补丁、动态类型,天然容易实现代理、装饰器;
class Singleton: _instance = None def __new__(cls): if not cls._instance: cls._instance = super().__new__(cls) return cls._instance核心认知:不要机械复制代码,用语言原生特性实现模式。比如Go优先组合代替继承;Python善用语法糖简化实现。
二、高频落地难点:线程安全单例
单例是面试与工程高频考点,区分几种方案优缺点:
-
饿汉式
类加载阶段初始化,天然线程安全;缺点:程序启动直接占用资源。 -
双重检查锁 DCL(懒加载)
延迟初始化,需要volatile禁止指令重排,Java标准工程方案。
public class DCLSingleton { private static volatile DCLSingleton instance; private DCLSingleton(){} public static DCLSingleton getInstance(){ if(instance == null){ synchronized (DCLSingleton.class){ if(instance == null){ instance = new DCLSingleton(); } } } return instance; }}-
静态内部类(推荐Java)
懒加载、无需锁、线程安全,综合最优。 -
枚举单例
杜绝反射破坏单例,防序列化漏洞。
踩坑提醒:懒加载场景不加同步机制,并发下会创建多个实例。
三、重中之重:避免过度设计
很多开发者学习模式后,强行套用,引发代码冗余。
判断标准
✅ 适合使用模式:
- 代码存在大量
if-else,后续需要持续扩展; - 模块之间耦合严重,需要隔离依赖;
- 明确预见未来存在多处扩展点。
❌ 不要强行上模式:
- 功能简单、几乎不会迭代变更;
- 为了“看起来规范”增加抽象层;
- 引入多层抽象,提升新人理解成本。
实操准则
- 先实现业务,重构再引入模式,不要一开始堆砌抽象;
- 遵循YAGNI原则:不需要的功能不要预先设计;
- 小规模逻辑优先简单实现,出现重复、扩展痛点再重构;
- 抽象要有收益,如果抽象带来的复杂度高于收益,直接写简单代码。
小结
- 模式思想通用,实现代码适配编程语言特性;
- 单例落地优先考虑并发安全、资源加载时机;
- 模式是解决耦合与扩展的工具,不要为了用模式而设计。
设计模式系列(五):代码落地核心要点
https://fuwari.vercel.app/posts/design-series/design-05-implementation/