当前位置: 首页 > 开发者资讯

Java 设计模式教程:常用设计模式及应用场景解析

  设计模式(Design Pattern)是软件设计中的一种通用解决方案,旨在解决在开发过程中遇到的常见问题。Java 作为一种面向对象的编程语言,支持丰富的设计模式,能够帮助开发人员创建更具可维护性、可扩展性和复用性的代码。

  一、设计模式的分类

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

  创建型模式:关注如何创建对象。常见的设计模式有单例模式、工厂模式、抽象工厂模式、建造者模式和原型模式。

  结构型模式:关注如何将类或对象组合成更大的结构。常见的设计模式有适配器模式、装饰器模式、代理模式、外观模式、桥接模式和组合模式。

  行为型模式:关注对象之间的通信与协作。常见的设计模式有观察者模式、策略模式、命令模式、责任链模式、状态模式和模板方法模式。

云服务器8.png

  二、常用设计模式及应用场景解析

  1. 单例模式(Singleton Pattern)

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

  应用场景:

  需要一个类只有一个实例的情况,如数据库连接池、线程池、日志记录器等。

  配置管理类。

  实现方式:

  懒汉式(线程不安全)

  懒汉式(线程安全)

  饿汉式(线程安全)

  双重检查锁(线程安全)

  javaCopy Codepublic class Singleton {

  private static Singleton instance;

  // 私有构造函数,防止外部创建对象

  private Singleton() {}

  // 双重检查锁的线程安全实现

  public static Singleton getInstance() {

  if (instance == null) {

  synchronized (Singleton.class) {

  if (instance == null) {

  instance = new Singleton();

  }

  }

  }

  return instance;

  }

  }

  2. 工厂模式(Factory Pattern)

  定义:工厂模式提供了创建对象的接口,但由子类决定实例化哪个类。

  应用场景:

  需要生成大量相关或相似对象时,避免直接调用构造函数。

  需要根据不同的输入条件选择不同类的实例。

  实现方式:

  简单工厂:通过一个工厂类返回不同类型的对象。

  工厂方法:让子类决定创建哪个具体产品类。

  抽象工厂:创建一组相关的工厂,负责创建不同系列的产品。

  javaCopy Code// 简单工厂

  public class AnimalFactory {

  public static Animal createAnimal(String type) {

  if ("Dog".equals(type)) {

  return new Dog();

  } else if ("Cat".equals(type)) {

  return new Cat();

  }

  return null;

  }

  }

  // 工厂方法

  public abstract class AnimalFactory {

  public abstract Animal createAnimal();

  }

  public class DogFactory extends AnimalFactory {

  @Override

  public Animal createAnimal() {

  return new Dog();

  }

  }

  3. 观察者模式(Observer Pattern)

  定义:观察者模式定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。

  应用场景:

  事件驱动系统,如 UI 更新、股票行情更新等。

  需要对象间自动同步的场景。

  实现方式:

  主题类(Subject):保持一组观察者对象,提供添加和删除观察者的方法。

  观察者类(Observer):定义更新接口,通知观察者进行相应更新。

  javaCopy Codepublic class Subject {

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

  public void addObserver(Observer observer) {

  observers.add(observer);

  }

  public void removeObserver(Observer observer) {

  observers.remove(observer);

  }

  public void notifyObservers() {

  for (Observer observer : observers) {

  observer.update();

  }

  }

  }

  public interface Observer {

  void update();

  }

  4. 策略模式(Strategy Pattern)

  定义:策略模式定义了一系列算法,并将每一个算法封装起来,使得它们可以互换。策略模式让算法独立于使用它的客户端独立变化。

  应用场景:

  当系统有多个算法可以选择时,根据不同的需求选择不同的算法进行计算。

  例如排序算法的选择,支付方式的选择。

  实现方式:

  定义一个策略接口,每个策略类实现这个接口。

  客户端通过注入不同的策略来实现不同的行为。

  javaCopy Codepublic interface Strategy {

  int doOperation(int a, int b);

  }

  public class AddOperation implements Strategy {

  @Override

  public int doOperation(int a, int b) {

  return a + b;

  }

  }

  public class Context {

  private Strategy strategy;

  public Context(Strategy strategy) {

  this.strategy = strategy;

  }

  public int executeStrategy(int a, int b) {

  return strategy.doOperation(a, b);

  }

  }

  5. 代理模式(Proxy Pattern)

  定义:代理模式为其他对象提供一个代理,以控制对这个对象的访问。

  应用场景:

  对象的创建成本较高,使用代理对象来延迟创建。

  需要对访问进行控制,如访问权限控制、懒加载等。

  实现方式:

  虚拟代理:用于控制对象的创建。

  远程代理:用于表示远程对象。

  保护代理:用于控制对对象的访问权限。

  javaCopy Codepublic interface RealSubject {

  void request();

  }

  public class RealSubjectImpl implements RealSubject {

  @Override

  public void request() {

  System.out.println("Real Subject request.");

  }

  }

  public class ProxySubject implements RealSubject {

  private RealSubjectImpl realSubject;

  @Override

  public void request() {

  if (realSubject == null) {

  realSubject = new RealSubjectImpl();

  }

  realSubject.request();

  }

  }

  6. 装饰器模式(Decorator Pattern)

  定义:装饰器模式允许在不改变原始对象的情况下,动态地给对象添加额外的功能。

  应用场景:

  需要为一个对象增加额外的功能,而又不希望修改对象的源代码。

  例如日志记录、性能监控等。

  实现方式:

  使用装饰器类扩展被装饰的类功能。

  javaCopy Codepublic interface Coffee {

  double cost();

  }

  public class SimpleCoffee implements Coffee {

  @Override

  public double cost() {

  return 5;

  }

  }

  public class MilkDecorator implements Coffee {

  private Coffee coffee;

  public MilkDecorator(Coffee coffee) {

  this.coffee = coffee;

  }

  @Override

  public double cost() {

  return coffee.cost() + 2;

  }

  }

  设计模式在软件开发中扮演着至关重要的角色。理解并掌握常用设计模式,不仅能够提高开发效率,还能增强代码的可维护性和可扩展性。本文介绍了几种常见的 Java 设计模式及其应用场景,希望能帮助你更好地理解如何运用这些模式来解决实际问题。

 


猜你喜欢