MST

星途 面试题库

面试题:Java中SOLID原则之单一职责原则在设计模式中的体现

请举例说明在Java的设计模式中,如何体现单一职责原则(SRP)。比如以常用的单例模式为例,阐述其如何遵循或违背该原则,并说明若违背可能带来的问题以及如何改进以符合单一职责原则。
38.0万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

1. 单一职责原则(SRP)简介

单一职责原则指的是一个类应该仅有一个引起它变化的原因,即一个类应该只负责一项职责。如果一个类承担了过多的职责,那么当其中一个职责发生变化时,可能会影响到其他职责的正常运行。

2. 单例模式遵循单一职责原则分析

以饿汉式单例模式为例:

public class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

在这个例子中,该单例类的职责非常明确,就是确保在整个应用程序中只有一个实例存在,并提供一个全局访问点。它专注于这一项职责,遵循了单一职责原则。

3. 单例模式可能违背单一职责原则及问题

假设我们对上述单例类进行不合理扩展,增加一些与实例管理无关的业务逻辑,例如:

public class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return INSTANCE;
    }
    // 新增与实例管理无关的业务逻辑
    public void calculateSum(int a, int b) {
        System.out.println("Sum: " + (a + b));
    }
}

这样该类就承担了两个职责:实例管理和业务计算。如果业务计算逻辑发生变化,就可能影响到单例模式相关的代码,反之亦然。这就违背了单一职责原则,可能导致代码的维护性和可扩展性变差。

4. 改进以符合单一职责原则

将业务逻辑分离出来,创建一个独立的类:

public class Singleton {
    private static final Singleton INSTANCE = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return INSTANCE;
    }
}

public class Calculator {
    public void calculateSum(int a, int b) {
        System.out.println("Sum: " + (a + b));
    }
}

通过这种方式,单例类专注于实例管理,而Calculator类专注于业务计算,各自职责明确,符合单一职责原则,使得代码更易于维护和扩展。