🧠 一文彻底搞清楚:单例类、枚举类、抽象类、接口、设计模式
本文将逐个解释:它们 是什么、学它有什么用、解决了什么问题、怎么用
🔹 1. 单例类(Singleton)
✅ 是什么:
一种设计模式:一个类在整个程序生命周期只会存在一个实例。
✅ 解决的问题:
-
资源共享(如配置对象、日志器、数据库连接池)
-
控制全局状态,只需一份实例,节省内存
✅ 学什么:
-
饿汉式 / 懒汉式 / 双重检查锁 / 枚举实现方式
-
多线程安全问题
✅ 示例(饿汉式):
public class Logger {
private static final Logger instance = new Logger();
private Logger() {} // 私有构造
public static Logger getInstance() {
return instance;
}
}
Logger.getInstance()
永远返回同一个对象
🔹 2. 枚举类(Enum)
✅ 是什么:
一种有固定值集合的类,每个枚举值本质上是这个类的一个实例。
✅ 解决的问题:
-
表达明确、受限的状态或类型(如星期、订单状态、性别)
-
安全替代魔法字符串 / 数字常量(可枚举 + 可扩展)
✅ 学什么:
-
枚举定义、枚举属性、枚举方法
-
枚举在 switch 中的使用
✅ 示例:
public enum OrderStatus {
PENDING, PAID, SHIPPED, COMPLETED
}
OrderStatus status = OrderStatus.PAID;
if (status == OrderStatus.PAID) {
// 处理支付逻辑
}
🔹 3. 抽象类(Abstract Class)
✅ 是什么:
不完整的类,不能实例化,必须被继承。可以有方法的默认实现,也可以包含抽象方法(没有实现的方法)。
✅ 解决的问题:
-
提供通用模板 + 部分行为实现
-
父类定义公共逻辑,子类补充细节
✅ 学什么:
-
abstract
修饰类和方法 -
抽象类 vs 接口的区别
✅ 示例:
public abstract class Animal {
public abstract void speak(); // 抽象方法
public void eat() {
System.out.println("Animal is eating");
}
}
public class Dog extends Animal {
public void speak() {
System.out.println("Woof!");
}
}
🔹 4. 接口(Interface)
✅ 是什么:
一组方法的规范或契约,实现类必须实现所有方法。Java 中接口支持多继承。
✅ 解决的问题:
-
实现解耦:只依赖方法定义,而非具体实现
-
支持多态、面向接口编程、插件式开发
✅ 学什么:
-
interface
定义语法 -
implements
和多接口实现 -
默认方法(default)、静态方法(static)
✅ 示例:
public interface Animal {
void speak();
}
public class Cat implements Animal {
public void speak() {
System.out.println("Meow~");
}
}
🔹 5. 设计模式(Design Patterns)
✅ 是什么:
前人总结的一套可复用、可维护、可扩展的解决方案模板,解决特定问题的代码设计方案。
✅ 解决的问题:
-
提高代码复用性、可读性、灵活性
-
解耦各模块职责,避免重复轮子
-
架构结构更清晰,易于扩展维护
🎯 常见设计模式分类(23 种经典):
类别 | 模式名称 | 中文名 | 作用方向 |
---|---|---|---|
创建型 | Singleton | 单例模式 | 控制对象的唯一实例 |
Factory Method | 工厂方法模式 | 延迟对象创建、解耦构造逻辑 | |
Abstract Factory | 抽象工厂模式 | 一组对象的构造工厂 | |
Builder | 建造者模式 | 构建复杂对象 | |
Prototype | 原型模式 | 克隆已有对象 | |
结构型 | Adapter | 适配器模式 | 接口转换,兼容旧接口 |
Bridge | 桥接模式 | 分离抽象和实现 | |
Composite | 组合模式 | 树状结构,如 DOM、菜单等 | |
Decorator | 装饰器模式 | 动态增强类功能 | |
Facade | 外观模式 | 简化外部调用接口 | |
Flyweight | 享元模式 | 共享重复对象,节省内存 | |
Proxy | 代理模式 | 控制对象访问 | |
行为型 | Strategy | 策略模式 | 可切换算法或行为 |
Template Method | 模板方法模式 | 定义流程骨架,子类实现步骤 | |
Observer | 观察者模式 | 事件发布-订阅 | |
State | 状态模式 | 对象状态切换 | |
Command | 命令模式 | 封装请求为对象 | |
Chain of Responsibility | 责任链模式 | 按顺序传递请求处理者 | |
Iterator | 迭代器模式 | 顺序访问集合内部元素 | |
Mediator | 中介者模式 | 降低对象之间耦合 | |
Memento | 备忘录模式 | 保存和恢复对象状态 | |
Interpreter | 解释器模式 | 自定义语言解析器 | |
Visitor | 访问者模式 | 扩展对象结构功能 |
🚶一句话记忆法(各类核心用途):
类型 | 一句话记忆 |
---|---|
创建型 | “怎么造对象?” |
结构型 | “怎么组合对象?” |
行为型 | “对象之间怎么协作?” |
🚶优先掌握的常用模式:
优先级 | 推荐模式 | 场景 |
---|---|---|
★★★★★ | 单例(Singleton) | Spring 容器/配置/缓存对象 |
★★★★★ | 工厂(Factory) | 控制对象创建逻辑,如 DAO 工厂 |
★★★★☆ | 策略(Strategy) | 可切换算法、支付/排序等策略选择 |
★★★★☆ | 模板(Template) | 通用流程抽象,Spring 的 JdbcTemplate |
★★★★☆ | 观察者(Observer) | 事件机制,如 DOM/事件总线 |
★★★★☆ | 装饰器(Decorator) | 动态增强类功能,如 I/O、日志拦截器 |
★★★☆☆ | 责任链(Chain) | 请求过滤链、权限验证、日志链 |
🔁 这些概念之间的区别与联系
项目 | 是什么 | 能否实例化 | 是否用于架构设计 | 能否包含方法体 |
---|---|---|---|---|
单例类 | 特殊设计类 | ✅ 仅一个 | ✅ | ✅ |
枚举类 | 常量集合 | ✅(固定多个) | ✅ | ✅(可定义方法) |
抽象类 | 模板类 | ❌ | ✅ | ✅(可部分实现) |
接口 | 方法契约 | ❌ | ✅ | ✅(default 除外) |
设计模式 | 设计思想 | ❌ | ✅✅✅ | ❌(不是代码结构) |
🧠 总结一句话
学好这 5 个概念,你就从“写代码的人”开始向“设计系统的人”进阶了。
✍️ 实战
学完这个概念 | 建议做什么 |
---|---|
单例类 | 自己实现一个线程安全的 Logger 工具类 |
枚举类 | 将系统中所有状态码、角色常量替换为 enum |
抽象类 | 尝试设计一个“抽象支付类”或“抽象动物类” |
接口 | 用接口定义一组“行为”,写多实现类 |
设计模式 | 每周学 1~2 个经典设计模式 + 实战项目应用 |