框架专题:设计模式

1. 什么是设计模式?

设计模式是一套经过验证的解决方案,用于解决软件开发中的常见问题。它不是具体的代码实现,而是一种可复用的思想和原则。设计模式的核心目标是提高代码的复用性、可扩展性和可维护性。

1.1 设计模式的三大特性

  • 可重用性:通过提取通用解决方案,避免重复开发。
  • 可读性:提供统一的术语和架构,方便团队协作。
  • 灵活性:增强代码的适应性,便于应对需求变更。

2. 设计模式的分类

根据《设计模式:可复用面向对象软件的基础》一书,设计模式可以分为以下三类:

2.1 创建型模式

创建型模式关注对象的实例化过程,旨在通过灵活的方式创建对象,而非直接实例化。常见的创建型模式包括:

  • 单例模式:确保一个类只有一个实例,并提供全局访问点。
  • 工厂方法模式:定义一个创建对象的接口,由子类决定实例化的类。
  • 抽象工厂模式:提供一个创建相关或依赖对象的接口,而无需指定它们的具体类。

2.2 结构型模式

结构型模式关注类和对象之间的组合,旨在通过灵活的方式构建复杂的结构。常见的结构型模式包括:

  • 适配器模式:将一个类的接口转换成客户端期望的接口。
  • 装饰者模式:动态地为对象增加功能。
  • 代理模式:为另一个对象提供代理以控制访问。

2.3 行为型模式

行为型模式关注对象之间的通信和职责划分。常见的行为型模式包括:

  • 观察者模式:定义对象间的一对多依赖,当一个对象状态改变时通知所有依赖对象。
  • 策略模式:定义一系列算法,并将它们封装起来,使它们可以互相替换。
  • 责任链模式:将请求沿着责任链传递,直到被某个对象处理。

3. 设计模式的实际应用场景

3.1 单例模式

场景 :配置文件加载器、数据库连接池、日志记录器等。
示例

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

3.2 工厂方法模式

场景 :框架中的对象创建需要灵活扩展,例如MyBatis的SQLSession工厂。
示例

interface Product {
    void use();
}

class ConcreteProductA implements Product {
    public void use() {
        System.out.println("Using Product A");
    }
}

class ConcreteProductB implements Product {
    public void use() {
        System.out.println("Using Product B");
    }
}

class Factory {
    public static Product createProduct(String type) {
        if (type.equals("A")) return new ConcreteProductA();
        else if (type.equals("B")) return new ConcreteProductB();
        return null;
    }
}

3.3 观察者模式

场景 :事件驱动编程、消息通知系统等。
示例

import java.util.ArrayList;
import java.util.List;

interface Observer {
    void update(String message);
}

class ConcreteObserver implements Observer {
    private String name;

    public ConcreteObserver(String name) {
        this.name = name;
    }

    public void update(String message) {
        System.out.println(name + " received: " + message);
    }
}

class Subject {
    private List<Observer> observers = new ArrayList<>();

    public void attach(Observer observer) {
        observers.add(observer);
    }

    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
}

4. 设计模式在框架中的应用

4.1 Spring 框架中的设计模式

  • 单例模式:Spring容器中的默认Bean是单例的。
  • 工厂方法模式BeanFactoryApplicationContext通过工厂模式创建和管理Bean。
  • 代理模式:AOP模块通过动态代理实现方法拦截。

4.2 MyBatis 框架中的设计模式

  • 工厂方法模式SqlSessionFactory用于创建SqlSession实例。
  • 代理模式:动态代理用于实现Mapper接口方法调用。
  • 模板方法模式BaseExecutor中定义了执行查询和更新的模板方法。

4.3 Hibernate 框架中的设计模式

  • 装饰者模式:Hibernate的Session对象对JDBC连接进行了封装和增强。
  • 策略模式:在查询缓存中选择不同的缓存策略。

5. 注意事项

5.1 合理选择设计模式

设计模式不是越多越好,而是需要根据实际场景和需求选择合适的模式。

5.2 避免过度设计

滥用设计模式可能导致代码复杂化,增加开发和维护成本。

5.3 理解模式之间的关系

一些设计模式是互补的,例如组合使用工厂方法模式和单例模式来管理全局实例。


6. 总结

设计模式是软件开发的重要工具,它不仅帮助我们解决常见问题,还为代码的长期可维护性提供了保障。在框架开发中,合理运用设计模式可以构建灵活且高效的系统架构。希望通过本文的讲解,您能对设计模式的核心思想和实际应用有更深入的理解。

相关推荐
lxyzcm6 小时前
深入理解C++23的Deducing this特性(上):基础概念与语法详解
开发语言·c++·spring boot·设计模式·c++23
越甲八千6 小时前
重温设计模式--单例模式
单例模式·设计模式
Vincent(朱志强)7 小时前
设计模式详解(十二):单例模式——Singleton
android·单例模式·设计模式
诸葛悠闲8 小时前
设计模式——桥接模式
设计模式·桥接模式
捕鲸叉12 小时前
C++软件设计模式之外观(Facade)模式
c++·设计模式·外观模式
先睡13 小时前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
Damon_X21 小时前
桥接模式(Bridge Pattern)
设计模式·桥接模式
越甲八千1 天前
重温设计模式--享元模式
设计模式·享元模式
码农爱java1 天前
设计模式--抽象工厂模式【创建型模式】
java·设计模式·面试·抽象工厂模式·原理·23种设计模式·java 设计模式