JAVA设计模式案例

很多大一初学Java的同学,学完面向对象、继承、接口后都会陷入迷茫:语法都会写,但写代码总是if-else满天飞、代码混乱、重复代码多、后期改不动。

其实设计模式就是解决这些问题的「通用编程模板」,是前辈程序员总结的、应对常见开发场景的最优写法。

对于大一新生,不用死记23种设计模式!本文精选最入门、最常用、最易落地的3种设计模式:单例模式、简单工厂模式、适配器模式。

全程通俗易懂、代码极简、适配初学者,看完就能懂、上手就能写,彻底告别烂代码!

一、为什么要学设计模式?

先给大一同学说句大实话:设计模式不高深,就是写代码的好习惯。

日常新手代码痛点:

  1. 重复造轮子,相同逻辑反复写;

  2. 对象创建混乱,到处new对象,浪费内存;

  3. if-else嵌套太多,新增功能就要改旧代码;

  4. 不同类、接口不兼容,代码无法复用。

而设计模式的核心目的只有3个:代码复用、解耦、易维护扩展,这也是Java面向对象编程的终极目标。

二、入门必学:单例模式(创建型模式)

  1. 核心概念

单例模式:保证一个类全局只有一个对象实例,提供一个全局访问入口,避免重复创建对象、浪费内存资源。

  1. 适用场景(大一秒懂)

• 全局工具类、配置类(系统配置、日志工具);

• 重复创建会消耗资源的对象(数据库连接、文件读取工具);

• 整个程序只需要一个实例的场景。

  1. 新手最简实现:饿汉式单例

这是大一考试、作业、入门开发最常用的写法,简单安全、线程无问题。
// 饿汉式单例模式(新手首选)
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:简单工厂模式(创建型模式)

  1. 核心概念

工厂模式:专门定义一个「工厂类」,统一负责对象的创建,将「对象创建」和「对象使用」彻底分开,消灭冗余的if-else。

  1. 适用场景

需要根据不同条件创建不同子类对象的场景,比如:支付方式、文件解析、多媒体播放、商品类型。

  1. 实战案例:多媒体播放器

我们实现一个播放器,支持播放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,新增格式要改主代码;

• 工厂模式写法:新增格式只需要新增实现类,无需改动原有业务代码,符合编程规范。

四、接口兼容神器:适配器模式(结构型模式)

  1. 核心概念

适配器模式:将不兼容的接口、类进行转换,让原本无法一起工作的代码,通过「适配器」完美适配工作,就像手机充电头适配器一样。

  1. 适用场景

旧代码、第三方工具、不同接口格式不统一,需要兼容复用的场景,是代码迭代、功能扩展的常用模式。

  1. 实战案例:播放器兼容小众格式

原有播放器只支持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. 适配器模式核心优势

  1. 不修改原有代码,通过适配器扩展新功能;

  2. 完美兼容新旧接口,代码复用率极高;

  3. 解决接口不兼容问题,是项目迭代必备模式。

五、大一学习总结(重点干货)

  1. 单例模式:控全局唯一对象,省内存,工具类必备;

  2. 简单工厂模式:解耦对象创建,消灭if-else,适合多子类场景;

  3. 适配器模式:接口兼容适配,扩展功能不改旧代码。

对于大一Java学习者,不用贪多求全,先吃透这3种高频模式,理解「解耦、复用、扩展」的核心思想,你的代码水平就能远超同级同学。

所有设计模式的本质,都是基于面向对象的封装、继承、多态,学好基础,设计模式自然一通百通!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值