Photo by Lorem Ipsum
1074 words
5 minutes
设计模式系列(三):工程高频常用模式
设计模式系列
Posts in this series (7)AI 智能总结
设计模式 3 工程高频常用模式
结合业务开发与面试考点,筛选9个最高频模式,基于之前的设计原则落地,附带极简代码、核心用途、适用场景,拒绝冗余概念。
1. 单例模式
核心:保证一个类在全局仅有一个实例,提供统一访问点。
场景:连接池、配置管理器、日志工具、缓存管理器
// 饿汉单例(简单线程安全)public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} // 私有构造,禁止new public static Singleton getInstance() { return INSTANCE; }}要点:私有化构造器;区分饿汉、懒汉、双重检查锁实现。
2. 工厂方法 & 抽象工厂
工厂方法:一个工厂只生产一类产品,扩展产品只需新增工厂类。
抽象工厂:生产一组相关产品,适合产品族场景。
场景:SDK实例创建、多数据库驱动实例化。
interface Product {}class ProductA implements Product {}
// 工厂方法interface Factory { Product create();}class AFactory implements Factory { @Override public Product create() { return new ProductA(); }}3. 策略模式
核心:把多变算法独立封装,运行时动态切换算法,消除大量if-else。
场景:支付方式、折扣算法、文件解析器
interface Strategy { void handle();}class StrategyA implements Strategy { @Override public void handle() {}}// 上下文class Context { private Strategy strategy; public void setStrategy(Strategy strategy) { this.strategy = strategy; } public void execute() { strategy.execute(); }}4. 观察者模式
核心:发布-订阅模型,主体状态变更自动通知所有订阅者。
场景:事件监听、消息通知、GUI回调、Spring事件驱动
// 观察者interface Observer { void update();}// 被观察者class Subject { private List<Observer> observers = new ArrayList<>(); public void addObserver(Observer o) {observers.add(o);} public void notifyAllObserver() { observers.forEach(Observer::update); }}5. 装饰器模式
核心:动态给对象叠加功能,相比继承更加灵活。
场景:IO流包装、权限叠加、请求参数增强
// 基础接口interface Coffee { double cost(); String desc();}
// 基础咖啡class SimpleCoffee implements Coffee { public double cost() {return 10;} public String desc() {return "纯咖啡";}}
// 装饰器基类abstract class CoffeeDecorator implements Coffee { protected Coffee coffee; public CoffeeDecorator(Coffee coffee) {this.coffee = coffee;}}
// 加奶装饰class MilkDecorator extends CoffeeDecorator { public MilkDecorator(Coffee coffee) {super(coffee);} public double cost() {return coffee.cost() + 2;} public String desc() {return coffee.desc() + "+牛奶";}}区分:装饰器包装自身实现同一接口;适配器用于转换接口。
6. 代理模式
核心:通过代理对象控制对真实对象的访问,增加前后置逻辑。
场景:远程代理、AOP切面、权限校验、缓存、延迟加载
分类:静态代理、动态代理(JDK/Cglib,面试重点)
// 静态代理示例:统一接口interface UserService { void addUser();}
// 真实实现class UserServiceImpl implements UserService { public void addUser() { /* 真实添加逻辑 */ }}
// 代理类class UserServiceProxy implements UserService { private UserService target = new UserServiceImpl();
public void addUser() { // 前置:权限校验 checkPermission(); target.addUser(); // 后置:日志记录 log(); }
private void checkPermission() {} private void log() {}}7. 模板方法模式
核心:父类定义固定执行流程,子类实现可变步骤。
场景:框架固定流程、文件解析、任务调度骨架
abstract class Template { // 固定流程 public final void run() { step1(); step2(); } protected abstract void step2(); private void step1() {}}8. 外观模式(门面)
核心:为复杂子系统提供统一简易入口,降低调用方复杂度。
场景:复杂第三方SDK封装、微服务聚合接口
class SubA{}class SubB{}// 门面class Facade { private SubA a = new SubA(); private SubB b = new SubB(); public void doService() { // 封装多个子系统调用 }}9. 适配器模式
核心:做接口转换器,兼容两套不兼容接口。
场景:新旧系统对接、第三方接口适配、兼容不同数据格式
// 目标接口interface Target {void request();}// 适配对象class Adaptee {public void specificRequest(){}}// 适配器class Adapter implements Target{ private Adaptee adaptee = new Adaptee(); @Override public void request() { adaptee.specificRequest(); }}模式快速区分口诀
- 装饰器:增强功能,同接口
- 适配器:转换接口,兼容异构
- 代理:控制访问,包装原对象
- 策略:消除if,动态切换算法
- 模板方法:流程固定,步骤拓展
开发准则:先用设计原则思考,再选用模式,杜绝为了使用模式而过度设计。
设计模式系列(三):工程高频常用模式
https://fuwari.vercel.app/posts/design-series/design-03-frequent-patterns/