很多大一初学Java的同学,学完面向对象、继承、接口后都会陷入迷茫:语法都会写,但写代码总是if-else满天飞、代码混乱、重复代码多、后期改不动。
其实设计模式就是解决这些问题的「通用编程模板」,是前辈程序员总结的、应对常见开发场景的最优写法。
对于大一新生,不用死记23种设计模式!本文精选最入门、最常用、最易落地的3种设计模式:单例模式、简单工厂模式、适配器模式。
全程通俗易懂、代码极简、适配初学者,看完就能懂、上手就能写,彻底告别烂代码!
一、为什么要学设计模式?
先给大一同学说句大实话:设计模式不高深,就是写代码的好习惯。
日常新手代码痛点:
-
重复造轮子,相同逻辑反复写;
-
对象创建混乱,到处new对象,浪费内存;
-
if-else嵌套太多,新增功能就要改旧代码;
-
不同类、接口不兼容,代码无法复用。
而设计模式的核心目的只有3个:代码复用、解耦、易维护扩展,这也是Java面向对象编程的终极目标。
二、入门必学:单例模式(创建型模式)
- 核心概念
单例模式:保证一个类全局只有一个对象实例,提供一个全局访问入口,避免重复创建对象、浪费内存资源。
- 适用场景(大一秒懂)
• 全局工具类、配置类(系统配置、日志工具);
• 重复创建会消耗资源的对象(数据库连接、文件读取工具);
• 整个程序只需要一个实例的场景。
- 新手最简实现:饿汉式单例
这是大一考试、作业、入门开发最常用的写法,简单安全、线程无问题。
// 饿汉式单例模式(新手首选)
public class SingletonUtil {
// 1. 私有静态实例:程序启动直接创建唯一对象
private static final SingletonUtil INSTANCE = new SingletonUtil();
// 2. 私有构造方法:禁止外部new对象,杜绝重复创建
private SingletonUtil(){}
// 3. 公共静态方法:全局唯一获取实例的入口
public static SingletonUtil getInstance(){
return INSTANCE;
}
// 自定义工具方法
public void showInfo(){
System.out.println("调用全局单例工具方法");
}
}
4. 测试代码
public class TestSingleton {
public static void main(String[] args) {
// 获取两个实例
SingletonUtil s1 = SingletonUtil.getInstance();
SingletonUtil s2 = SingletonUtil.getInstance();
// 对比地址:true 说明是同一个对象
System.out.println(s1 == s2);
s1.showInfo();
}
}
5. 优缺点总结(新手重点记)
✅ 优点:写法简单、安全稳定、无多线程问题、适合绝大多数入门场景;
❌ 缺点:程序启动就加载对象,少量浪费极小内存(可忽略)。
三、告别if-else:简单工厂模式(创建型模式)
- 核心概念
工厂模式:专门定义一个「工厂类」,统一负责对象的创建,将「对象创建」和「对象使用」彻底分开,消灭冗余的if-else。
- 适用场景
需要根据不同条件创建不同子类对象的场景,比如:支付方式、文件解析、多媒体播放、商品类型。
- 实战案例:多媒体播放器
我们实现一个播放器,支持播放MP3、MP4格式,用工厂模式优化新手冗余代码。
步骤1:定义统一媒体播放接口
// 媒体播放统一接口
public interface MediaPlayer {
void play(String fileName);
}
步骤2:实现不同格式播放器
// MP3播放器实现类
public class Mp3Player implements MediaPlayer{
@Override
public void play(String fileName) {
System.out.println(“正在播放MP3音乐:” + fileName);
}
}
// MP4播放器实现类
public class Mp4Player implements MediaPlayer{
@Override
public void play(String fileName) {
System.out.println(“正在播放MP4视频:” + fileName);
}
}
步骤3:创建工厂类(核心!统一创建对象)
// 媒体工厂类:专门创建播放器对象
public class MediaFactory {
// 根据格式类型,返回对应播放器
public static MediaPlayer getPlayer(String mediaType){
if (“mp3”.equalsIgnoreCase(mediaType)){
return new Mp3Player();
} else if (“mp4”.equalsIgnoreCase(mediaType)){
return new Mp4Player();
} else {
System.out.println(“暂不支持该格式”);
return null;
}
}
}
步骤4:测试调用
public class TestFactory {
public static void main(String[] args) {
// 无需new具体子类,直接通过工厂获取对象
MediaPlayer mp3 = MediaFactory.getPlayer(“mp3”);
mp3.play(“晴天.mp3”);
MediaPlayer mp4 = MediaFactory.getPlayer("mp4");
mp4.play("风景视频.mp4");
}
}
4. 模式优势对比
• 新手原生写法:满屏if-else,新增格式要改主代码;
• 工厂模式写法:新增格式只需要新增实现类,无需改动原有业务代码,符合编程规范。
四、接口兼容神器:适配器模式(结构型模式)
- 核心概念
适配器模式:将不兼容的接口、类进行转换,让原本无法一起工作的代码,通过「适配器」完美适配工作,就像手机充电头适配器一样。
- 适用场景
旧代码、第三方工具、不同接口格式不统一,需要兼容复用的场景,是代码迭代、功能扩展的常用模式。
- 实战案例:播放器兼容小众格式
原有播放器只支持MP3、MP4,现在需要适配VLG、FLAC小众格式,用适配器模式改造,不改动原有代码。
步骤1:扩展高级媒体播放接口
// 高级播放器接口(支持小众格式)
public interface AdvancedMediaPlayer {
void playAdvanced(String type, String fileName);
}
步骤2:小众格式播放器实现
// VLC格式播放器
public class VlcPlayer implements AdvancedMediaPlayer{
@Override
public void playAdvanced(String type, String fileName) {
System.out.println(“播放VLC格式文件:” + fileName);
}
}
// FLAC无损音乐播放器
public class FlacPlayer implements AdvancedMediaPlayer{
@Override
public void playAdvanced(String type, String fileName) {
System.out.println(“播放FLAC无损音乐:” + fileName);
}
}
步骤3:核心适配器类(格式适配转换)
// 媒体适配器:适配新旧播放接口
public class MediaAdapter implements MediaPlayer {
private AdvancedMediaPlayer advancedPlayer;
// 根据格式匹配对应的高级播放器
public MediaAdapter(String type){
if ("vlc".equalsIgnoreCase(type)){
advancedPlayer = new VlcPlayer();
} else if ("flac".equalsIgnoreCase(type)){
advancedPlayer = new FlacPlayer();
}
}
@Override
public void play(String fileName) {
String type = fileName.substring(fileName.lastIndexOf(".") + 1);
advancedPlayer.playAdvanced(type, fileName);
}
}
步骤4:改造原有播放器,整合适配器
// 终极播放器:兼容所有格式
public class AllMediaPlayer implements MediaPlayer{
private MediaAdapter adapter;
@Override
public void play(String fileName) {
String type = fileName.substring(fileName.lastIndexOf(".") + 1);
// 普通格式直接播放
if ("mp3".equalsIgnoreCase(type) || "mp4".equalsIgnoreCase(type)){
if ("mp3".equalsIgnoreCase(type)){
new Mp3Player().play(fileName);
}else {
new Mp4Player().play(fileName);
}
}else {
// 小众格式通过适配器适配播放
adapter = new MediaAdapter(type);
adapter.play(fileName);
}
}
}
步骤5:测试所有格式
public class TestAdapter {
public static void main(String[] args) {
AllMediaPlayer player = new AllMediaPlayer();
player.play(“七里香.mp3”);
player.play(“动漫剪辑.mp4”);
player.play(“高清视频.vlc”);
player.play(“无损音乐.flac”);
}
}
4. 适配器模式核心优势
-
不修改原有代码,通过适配器扩展新功能;
-
完美兼容新旧接口,代码复用率极高;
-
解决接口不兼容问题,是项目迭代必备模式。
五、大一学习总结(重点干货)
-
单例模式:控全局唯一对象,省内存,工具类必备;
-
简单工厂模式:解耦对象创建,消灭if-else,适合多子类场景;
-
适配器模式:接口兼容适配,扩展功能不改旧代码。
对于大一Java学习者,不用贪多求全,先吃透这3种高频模式,理解「解耦、复用、扩展」的核心思想,你的代码水平就能远超同级同学。
所有设计模式的本质,都是基于面向对象的封装、继承、多态,学好基础,设计模式自然一通百通!

1530

被折叠的 条评论
为什么被折叠?



