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

相关推荐
带刺的坐椅20 小时前
Solon v3.4.7, v3.5.6, v3.6.1 发布(国产优秀应用开发框架)
java·spring·solon
四谎真好看21 小时前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
桦说编程21 小时前
深入解析CompletableFuture源码实现(2)———双源输入
java·后端·源码
java_t_t21 小时前
ZIP工具类
java·zip
lang201509281 天前
Spring Boot优雅关闭全解析
java·spring boot·后端
pengzhuofan1 天前
第10章 Maven
java·maven
百锦再1 天前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
刘一说1 天前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
壹佰大多1 天前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring
百锦再1 天前
对前后端分离与前后端不分离(通常指服务端渲染)的架构进行全方位的对比分析
java·开发语言·python·架构·eclipse·php·maven