文章目录
- 真正学会设计模式的正确路径(超简单)
-
- [第一步:先学 5 大设计原则](#第一步:先学 5 大设计原则)
- [第二步:只学最常用 8 种](#第二步:只学最常用 8 种)
- [第三步:**每个模式只记一句话 + 一个业务场景**](#第三步:每个模式只记一句话 + 一个业务场景)
- [第四步:在 Spring / MyBatis / JDK 里找模式](#第四步:在 Spring / MyBatis / JDK 里找模式)
-
- [1. 单例模式(Singleton)](#1. 单例模式(Singleton))
- [2. 工厂 / 抽象工厂(Factory)](#2. 工厂 / 抽象工厂(Factory))
- [3. 策略模式(Strategy)](#3. 策略模式(Strategy))
- [4. 模板方法(Template)](#4. 模板方法(Template))
- [5. 适配器模式(Adapter)](#5. 适配器模式(Adapter))
- [6. 装饰器模式(Decorator)](#6. 装饰器模式(Decorator))
- [7. 观察者模式(Observer)](#7. 观察者模式(Observer))
- [8. 建造者模式(Builder)](#8. 建造者模式(Builder))
- 三、一句大实话
设计模式本身就不是"靠背"的东西 ,它难,是因为它的 打开方式不对 。
真正学会设计模式的正确路径(超简单)
第一步:先学 5 大设计原则
不用背,理解意思就行:
- 单一职责:一个类只干一件事
- 开闭原则:扩展开放,修改关闭
- 里氏替换:子类能替换父类
- 接口隔离:接口小而专
- 依赖倒置:依赖抽象,不依赖细节
原则懂了,模式自然懂。
第二步:只学最常用 8 种
其他全部暂时扔掉:
- 单例(Singleton)
- 工厂/抽象工厂(Factory)
- 策略(Strategy)
- 模板方法(Template)
- 适配器(Adapter)
- 装饰器(Decorator)
- 观察者(Observer)
- 建造者(Builder)
第三步:每个模式只记一句话 + 一个业务场景
比如:
-
单例(Singleton)
一句话:全局只创建一个对象,避免重复实例浪费资源。
场景:项目中的线程池、连接池、配置工具类,整个系统只需要一份。
-
工厂/抽象工厂(Factory)
一句话:把创建对象的逻辑封装起来,外部只需要拿产品,不用关心怎么 new。
场景:系统接入支付宝、微信、云闪付,通过工厂统一获取不同支付实例。
-
策略(Strategy)
一句话:定义一组可互换的算法,运行时灵活切换不同实现。
场景:订单结算支持原价、折扣、满减、会员价等多种计价方式自由切换。
-
模板方法(Template)
一句话:固定业务流程骨架,可变步骤交给子类实现。
场景:统一的审核流程(提交→校验→审批→通知),不同业务只自定义校验逻辑。
-
适配器(Adapter)
一句话:把不兼容的接口包装一层,转换成目标接口,让系统能无缝使用。
场景:对接多个第三方短信服务商,通过适配器统一成一套 sendSms 接口。
-
装饰器(Decorator)
一句话:不修改原有类,动态给对象叠加额外功能。
场景:给基础的 API 服务依次添加日志、限流、缓存、加密等增强能力。
-
观察者(Observer)
一句话:一个对象状态变化,自动通知所有依赖它的对象。
场景:用户下单支付成功后,自动通知库存扣减、发送短信、推送消息、生成账单。
-
建造者(Builder)
一句话:分步构建复杂对象,链式调用,结构清晰。
场景:构建复杂的查询条件、订单参数、Http请求对象,用链式优雅拼装属性。
第四步:在 Spring / MyBatis / JDK 里找模式
你天天用,只是没意识到:
1. 单例模式(Singleton)
一句话:全局唯一实例
- Spring :
@Scope("singleton"),所有默认 Bean 都是单例 - MyBatis :
SqlSessionFactory全局唯一 - JDK :
Runtime.getRuntime()、Desktop.getDesktop()
2. 工厂 / 抽象工厂(Factory)
一句话:封装对象创建,不直接new
- Spring :
BeanFactory、ApplicationContext - MyBatis :
SqlSessionFactory创建SqlSession - JDK :
LoggerFactory.getLogger()、BeanFactory
3. 策略模式(Strategy)
一句话:算法可互换,运行时切换
- Spring :
ResourceLoader(切换文件/网络/classpath资源) - MyBatis :
StatementHandler(切换PreparedStatement/CallableStatement) - JDK :
Comparator比较器、ThreadPoolExecutor拒绝策略
4. 模板方法(Template)
一句话:固定流程骨架,子类填细节
- Spring :
JdbcTemplate、RedisTemplate、RestTemplate - MyBatis :
BaseExecutor - JDK :
HttpServlet(doGet/doPost)、AbstractList
5. 适配器模式(Adapter)
一句话:接口不兼容,包一层转换
- Spring :
HandlerInterceptorAdapter、WebMvcConfigurerAdapter - MyBatis :
LogAdapter(适配Log4j/Slf4j) - JDK :
Arrays.asList()、InputStreamReader(字节转字符)
6. 装饰器模式(Decorator)
一句话:动态增强,不改原类
- Spring :
SessionAutoFlushProxy、BeanWrapper - MyBatis :
CachingExecutor给执行器加缓存 - JDK :
BufferedReader、BufferedInputStream、DataInputStream
7. 观察者模式(Observer)
一句话:一个变化,自动通知一堆
- Spring :
ApplicationEvent+ApplicationListener - MyBatis :
Interceptor拦截器 - JDK :
EventListener、Button.addActionListener
8. 建造者模式(Builder)
一句话:链式构造复杂对象
- Spring :
BeanDefinitionBuilder、MockMvc - MyBatis :
SqlSessionFactoryBuilder、CacheBuilder - JDK :
StringBuilder、Lombok @Builder
一看源码,瞬间顿悟。
三、一句大实话
设计模式不是学问,是"工程经验"。
你写得多、踩坑多、重构多,自然就懂了。
强行背定义只会越学越痛苦。