365bet主页

Java 设计模式全解析:23 种模式分类与实战代码指南

📅 2025-09-30 19:51:27 👤 admin 👁️ 4451 🏷️ 687

Java 设计模式全解析:23 种模式分类与实战代码指南

设计模式是面向对象编程中解决重复问题的成熟方案,Java 作为 OOP 典范语言,其生态对设计模式的落地尤为典型。本文将 23 种经典设计模式按创建型、结构型、行为型分类拆解,通过核心思想提炼与精简代码示例,详解每种模式的适用场景与实现精髓,帮助开发者在实际开发中灵活运用以提升代码质量。

一、创建型模式:对象创建的优化艺术

创建型模式专注于对象创建机制的封装,通过解耦对象创建与使用逻辑,实现系统的灵活扩展。

1. 单例模式(Singleton)

核心思想:确保类仅有一个实例,并提供全局访问点。

适用场景:全局配置、线程池、日志对象等。

Java 实现(懒汉式双重校验锁):

public class Singleton {

private static volatile Singleton instance;

private Singleton() {} // 私有构造防实例化

public static Singleton getInstance() {

if (instance == null) {

synchronized (Singleton.class) {

if (instance == null) {

instance = new Singleton();

}

}

}

return instance;

}

}

2. 工厂模式(Factory)

核心思想:封装对象创建逻辑,客户端无需关注具体实现。

分类:简单工厂、工厂方法、抽象工厂。

工厂方法示例:

// 产品接口

public interface Shape { void draw(); }

// 具体产品

public class Circle implements Shape {

@Override

public void draw() { System.out.println("绘制圆形"); }

}

// 工厂接口

public interface ShapeFactory { Shape createShape(); }

// 具体工厂

public class CircleFactory implements ShapeFactory {

@Override

public Shape createShape() { return new Circle(); }

}

3. 建造者模式(Builder)

核心思想:分离复杂对象构建与表示,支持分步创建。

适用场景:参数繁多的对象(如配置类、POJO)。

实现示例:

public class Computer {

private String cpu;

private String ram;

private Computer(Builder builder) {

this.cpu = builder.cpu;

this.ram = builder.ram;

}

public static class Builder {

private String cpu;

private String ram;

public Builder cpu(String cpu) {

this.cpu = cpu;

return this;

}

public Builder ram(String ram) {

this.ram = ram;

return this;

}

public Computer build() { return new Computer(this); }

}

}

// 使用:new Computer.Builder().cpu("i7").ram("16GB").build()

二、结构型模式:类与对象的组合策略

结构型模式通过类或对象的灵活组合,优化系统结构以解决接口适配、功能扩展等问题。

1. 代理模式(Proxy)

核心思想:为目标对象提供代理,控制访问权限或增强功能。

应用场景:远程调用、权限控制、缓存。

JDK 动态代理示例:

public interface UserService { void login(String name); }

public class UserServiceImpl implements UserService {

@Override

public void login(String name) { System.out.println(name + "登录"); }

}

// 代理处理器

public class LogProxy implements InvocationHandler {

private Object target;

public LogProxy(Object target) { this.target = target; }

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

System.out.println("调用前日志:" + method.getName());

Object result = method.invoke(target, args);

System.out.println("调用后日志:" + method.getName());

return result;

}

}

2. 装饰器模式(Decorator)

核心思想:动态为对象添加功能,不改变原类结构。

优势:替代继承,避免类爆炸。

实现示例:

// 核心接口

public interface Coffee {

String getDesc();

double cost();

}

// 基础实现

public class SimpleCoffee implements Coffee {

@Override

public String getDesc() { return "纯咖啡"; }

@Override

public double cost() { return 5.0; }

}

// 装饰器抽象类

public abstract class CoffeeDecorator implements Coffee {

protected Coffee coffee;

public CoffeeDecorator(Coffee coffee) { this.coffee = coffee; }

}

// 具体装饰器

public class MilkDecorator extends CoffeeDecorator {

public MilkDecorator(Coffee coffee) { super(coffee); }

@Override

public String getDesc() { return coffee.getDesc() + "+牛奶"; }

@Override

public double cost() { return coffee.cost() + 2.0; }

}

3. 适配器模式(Adapter)

核心思想:转换接口适配客户端需求,解决兼容性问题。

对象适配器示例:

// 目标接口

public interface Target { void request(); }

// 适配者

public class Adaptee {

public void specificRequest() { System.out.println("适配者处理"); }

}

// 适配器

public class Adapter implements Target {

private Adaptee adaptee;

public Adapter(Adaptee adaptee) { this.adaptee = adaptee; }

@Override

public void request() { adaptee.specificRequest(); }

}

三、行为型模式:对象间的交互协调

行为型模式聚焦对象间的通信与职责分配,优化系统行为协作逻辑。

1. 观察者模式(Observer)

核心思想:定义一对多依赖,状态变化时通知所有依赖者。

应用场景:事件监听、消息通知。

实现示例:

import java.util.ArrayList;

import java.util.List;

// 主题接口

public interface Subject {

void register(Observer o);

void remove(Observer o);

void notifyObservers();

}

// 观察者接口

public interface Observer { void update(String msg); }

// 具体主题

public class NewsSubject implements Subject {

private List observers = new ArrayList<>();

private String news;

@Override

public void register(Observer o) { observers.add(o); }

@Override

public void remove(Observer o) { observers.remove(o); }

@Override

public void notifyObservers() {

for (Observer o : observers) o.update(news);

}

public void setNews(String news) {

this.news = news;

notifyObservers();

}

}

2. 策略模式(Strategy)

核心思想:封装算法家族,支持动态切换。

优势:避免多重条件判断。

实现示例:

// 策略接口

public interface Payment { void pay(double amount); }

// 具体策略

public class CreditCardPay implements Payment {

private String cardNo;

public CreditCardPay(String cardNo) { this.cardNo = cardNo; }

@Override

public void pay(double amount) {

System.out.println(amount + "元信用卡支付,卡号:" + cardNo);

}

}

// 策略使用者

public class ShoppingCart {

private Payment payment;

public void setPayment(Payment payment) { this.payment = payment; }

public void checkout(double amount) { payment.pay(amount); }

}

3. 模板方法模式(Template Method)

核心思想:父类定义算法骨架,子类实现具体步骤。

适用场景:流程固定但细节可变(如报表生成)。

实现示例:

// 抽象父类

public abstract class Game {

// 模板方法(不可重写)

public final void play() {

init();

start();

end();

}

protected abstract void init();

protected abstract void start();

// 钩子方法(可选实现)

protected void end() { System.out.println("游戏结束"); }

}

// 具体实现

public class Football extends Game {

@Override

protected void init() { System.out.println("足球游戏初始化"); }

@Override

protected void start() { System.out.println("足球游戏开始"); }

}

四、其他常用模式速览

模式类型

模式名称

核心用途

创建型

原型模式

通过复制创建对象,避免重复初始化

创建型

抽象工厂模式

创建相关联的对象家族

结构型

桥接模式

分离抽象与实现,两者独立扩展

结构型

组合模式

统一处理单个对象与对象集合

结构型

享元模式

共享细粒度对象,减少内存占用

结构型

外观模式

为复杂系统提供统一访问接口

行为型

迭代器模式

遍历集合对象,封装遍历逻辑

行为型

命令模式

将请求封装为对象,支持撤销 / 重做

行为型

责任链模式

多对象轮流处理请求,解耦发送者与接收者

行为型

备忘录模式

保存对象状态,支持恢复

五、模式选择与应用原则

1. 核心选择依据

需控制对象创建:单例(唯一实例)、工厂(复杂创建)、建造者(分步构建);

需优化结构组合:装饰器(功能扩展)、适配器(接口适配)、代理(访问控制);

需协调对象行为:观察者(状态通知)、策略(算法切换)、模板方法(流程固定)。

2. 设计原则适配

开闭原则:策略模式(扩展新策略不改旧代码)、装饰器模式(新增装饰不影响核心);

依赖倒置:工厂模式(依赖接口而非实现)、观察者模式(主题依赖抽象观察者);

里氏替换:模板方法模式(子类可替换父类参与流程)。

六、总结

Java 设计模式的 23 种模式本质是 “问题 - 解决方案” 的映射集合,三大分类各有侧重:创建型解决对象创建的灵活性问题,结构型解决系统结构的扩展性问题,行为型解决对象交互的协调性问题。

实际应用中需避免 “为模式而模式”,关键在于:

理解模式解决的核心痛点,而非死记代码结构;

结合业务场景组合模式(如工厂 + 策略、装饰器 + 代理);

优先保持代码简洁,复杂模式仅用于解决对应复杂问题。

设计模式是前人的经验沉淀,但其价值在于启发设计思维。随着 Java 语言发展(如 Records、Sealed Classes),部分模式的实现得以简化,但 “解耦、复用、可扩展” 的核心设计思想始终是高质量代码的基石。

相关推荐

qq怎么设置赞权限啊

qq怎么设置赞权限啊 此情已成追忆 精选回答 qq设置赞权限步骤: 1、登录qq; 2、在qq界面手指向右滑动,会出现菜单,点击“设置”; 3、在“设

10万的车泡水了保险能赔多少?自己把车开到水里保险全赔吗

汽车涉水之后,保险公司会委托有资质的机构对车辆进行定损,然后再评估车辆的当前价值和残值确定是否还有维修价值。在有维修价值的前提

叫我如何不爱他在线阅读

2019-12-01 09:45:29 番外 甜蜜(2) 五年后……早上十点,阳光从厚重的窗帘缝隙挤进来,洒在了这间布置温馨的屋子里。从前只有黑白黑的房间已