【Java 基础】-- 设计模式

目录

[Java 设计模式详解](#Java 设计模式详解)

[1. 设计模式定义](#1. 设计模式定义)

[2. 设计模式示例](#2. 设计模式示例)

[2.1 单例模式(Singleton Pattern)](#2.1 单例模式(Singleton Pattern))

[2.2 工厂模式(Factory Pattern)](#2.2 工厂模式(Factory Pattern))

[2.3 观察者模式(Observer Pattern)](#2.3 观察者模式(Observer Pattern))

[2.4 代理模式(Proxy Pattern)](#2.4 代理模式(Proxy Pattern))

[2.5 适配器模式(Adapter Pattern)](#2.5 适配器模式(Adapter Pattern))

[3. 设计模式的应用场景](#3. 设计模式的应用场景)

[4. 设计模式的注意事项](#4. 设计模式的注意事项)

结语

Java 设计模式详解

1. 设计模式定义

设计模式(Design Patterns)是一套被软件开发行业广泛认可的最佳实践,用于解决常见的软件设计问题。它们是经验的总结,能够提高代码的可维护性、可复用性和可扩展性。

设计模式通常分为三大类:

  • 创建型模式(Creational Patterns):处理对象的创建问题。
  • 结构型模式(Structural Patterns):关注对象的组成结构。
  • 行为型模式(Behavioral Patterns):关注对象间的交互和职责划分。

2. 设计模式示例

2.1 单例模式(Singleton Pattern)

定义:单例模式保证一个类仅有一个实例,并提供一个全局访问点。

示例(懒汉式,线程安全):

复制代码
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.2 工厂模式(Factory Pattern)

定义:提供一个创建对象的接口,而不指定具体类。

示例

复制代码
interface Product {
    void create();
}
class ProductA implements Product {
    public void create() { System.out.println("Product A created"); }
}
class ProductB implements Product {
    public void create() { System.out.println("Product B created"); }
}
class Factory {
    public static Product getProduct(String type) {
        if ("A".equals(type)) return new ProductA();
        if ("B".equals(type)) return new ProductB();
        return null;
    }
}

使用场景

  • 需要创建复杂对象,但不想直接使用 new 关键字。

注意事项

  • 简单工厂模式容易违反开闭原则,建议结合工厂方法模式使用。

2.3 观察者模式(Observer Pattern)

定义:定义对象间的一对多依赖关系,当一个对象状态改变时,所有依赖者都会收到通知。

示例

复制代码
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 addObserver(Observer observer) { observers.add(observer); }
    public void notifyObservers(String message) {
        for (Observer observer : observers) {
            observer.update(message);
        }
    }
}

public class ObserverPatternDemo {
    public static void main(String[] args) {
        Subject subject = new Subject();
        Observer o1 = new ConcreteObserver("Observer 1");
        Observer o2 = new ConcreteObserver("Observer 2");
        subject.addObserver(o1);
        subject.addObserver(o2);
        subject.notifyObservers("Update received!");
    }
}

使用场景

  • 事件监听机制,如 GUI 组件、消息推送。

注意事项

  • 防止循环依赖,注意性能问题。

2.4 代理模式(Proxy Pattern)

定义:代理模式为某个对象提供一个替代访问方式,控制对对象的访问。

示例

复制代码
interface Service {
    void request();
}
class RealService implements Service {
    public void request() {
        System.out.println("Real service is processing request.");
    }
}
class ProxyService implements Service {
    private RealService realService;
    public void request() {
        if (realService == null) {
            realService = new RealService();
        }
        System.out.println("Proxy controlling access to real service.");
        realService.request();
    }
}

使用场景

  • 远程代理、虚拟代理、权限控制。

注意事项

  • 可能增加额外的复杂度和性能开销。

2.5 适配器模式(Adapter Pattern)

定义:适配器模式用于将一个接口转换为客户期望的另一个接口。

示例

复制代码
interface Target {
    void request();
}
class Adaptee {
    void specificRequest() {
        System.out.println("Adaptee-specific request");
    }
}
class Adapter implements Target {
    private Adaptee adaptee = new Adaptee();
    public void request() {
        adaptee.specificRequest();
    }
}

使用场景

  • 需要让旧系统兼容新接口。

注意事项

  • 可能引入额外的复杂性。

3. 设计模式的应用场景

设计模式 典型使用场景
单例模式 配置管理、线程池、日志管理
工厂模式 数据库连接、日志记录、解析器
观察者模式 消息订阅、事件驱动系统
代理模式 动态代理、权限管理
适配器模式 兼容不同的 API 接口
策略模式 订单支付方式选择、排序算法
装饰器模式 运行时动态增加功能,如 I/O 流

4. 设计模式的注意事项

  • 选择合适的模式:不要盲目使用设计模式,确保它真正解决问题。
  • 避免过度设计:不必要的设计模式会增加代码复杂性。
  • 结合 SOLID 原则:确保代码的可维护性和可扩展性。
  • 关注性能:某些模式(如观察者模式)可能带来额外的性能开销。
  • 遵循开闭原则:尽量让代码对扩展开放,对修改封闭。

结语

Java 设计模式是提升代码质量的有力工具。掌握这些模式,可以在开发中编写出更加优雅、可维护的代码。建议通过实践不断加深理解,灵活运用设计模式解决实际问题!

相关推荐
盖世英雄酱5813610 分钟前
为什么类型转换,为导致索引失效
java·后端
步行cgn16 分钟前
Java 集合有序性与重复性总结及记忆技巧
java·开发语言·程序人生·面试·个人开发·学习方法
顾林海16 分钟前
深度解析HashSet工作原理
android·java·面试
爱的叹息20 分钟前
Spring MVC 逻辑视图(JSP、Thymeleaf、FreeMarker)与非逻辑视图(JSON、Excel、PDF、XML)详解及示例
java·spring·mvc
我言秋日胜春朝★29 分钟前
【C++11】特殊类的设计 && 单例模式 && 类型转换
开发语言·c++·单例模式
程序员鱼皮30 分钟前
2025 全新阿里巴巴 Java 面经汇总(附答案模板),建议收藏!
java·后端·面试
电子科技圈31 分钟前
IAR推动嵌入式开发:云就绪、可扩展的CI/CD和可持续自动化
嵌入式硬件·设计模式·自动化·软件工程·软件构建·设计规范
木昜先生31 分钟前
知识点:Java 中的 Lambda 表达式
java·后端
Plus-ultra37 分钟前
Java面试43-常见的限流算法有哪些?
java·开发语言·面试
半新半旧38 分钟前
Java 容器源码分析
java·开发语言