1074 words
5 minutes
设计模式系列(三):工程高频常用模式

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();
}
}

模式快速区分口诀#

  1. 装饰器:增强功能,同接口
  2. 适配器:转换接口,兼容异构
  3. 代理:控制访问,包装原对象
  4. 策略:消除if,动态切换算法
  5. 模板方法:流程固定,步骤拓展

开发准则:先用设计原则思考,再选用模式,杜绝为了使用模式而过度设计。

设计模式系列(三):工程高频常用模式
https://fuwari.vercel.app/posts/design-series/design-03-frequent-patterns/
Author
Zero02
Published at
2025-07-15
License
CC BY-NC-SA 4.0