Java设计模式简介

1. 什么是设计模式?

设计模式是一种解决软件设计问题的方案或蓝图,它可以帮助我们开发出可重用、可维护、可扩展、可理解的软件系统。设计模式提供了一种通用的解决方案,可以在特定的情况下解决某些常见的设计问题。

设计模式通常包含了一组设计原则、模式的结构和相互之间的关系,以及相应的代码示例。Java设计模式是一套用于Java语言的设计模式,它们旨在提高代码的质量、可读性和可维护性。

2. 常见的设计模式

Java设计模式可以分为三大类别:创建型模式结构型模式行为型模式。接下来,我们将介绍每个类别中的一些常见设计模式。

2.1 创建型模式

创建型模式主要用于创建对象的机制,将对象的创建与使用分离,以提高代码的灵活性和可维护性。

2.1.1 工厂模式

工厂模式是一种通过工厂方法或抽象工厂来创建对象的模式。它隐藏了具体实现类的细节,只暴露了接口或抽象类给外界。

// 定义一个接口
interface Shape {
    void draw();
}

// 定义具体实现类
class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("绘制一个圆形");
    }
}

class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("绘制一个矩形");
    }
}

// 定义工厂类
class ShapeFactory {
    public Shape getShape(String shapeType) {
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        }
        return null;
    }
}

// 使用工厂创建对象
public class FactoryPatternDemo {
    public static void main(String[] args) {
        ShapeFactory shapeFactory = new ShapeFactory();

        // 获取 Circle 对象,并调用其 draw 方法
        Shape circle = shapeFactory.getShape("CIRCLE");
        circle.draw();

        // 获取 Rectangle 对象,并调用其 draw 方法
        Shape rectangle = shapeFactory.getShape("RECTANGLE");
        rectangle.draw();
    }
}
2.1.2 单例模式

单例模式确保一个类只有一个实例,并提供全局访问点以获取该实例。

class Singleton {
    private static Singleton instance;

    private Singleton() {
    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    public void showMessage() {
        System.out.println("Hello World!");
    }
}

public class SingletonPatternDemo {
    public static void main(String[] args) {
        // 获取唯一可用的对象
        Singleton singleton = Singleton.getInstance();

        // 显示消息
        singleton.showMessage();
    }
}

2.2 结构型模式

结构型模式主要关注对象的组合,以形成更大的结构,提供了一种简化系统结构的方法。

2.2.1 适配器模式

适配器模式用于将一个类的接口转换成客户端所期望的另一个接口。

// 接口
interface MediaPlayer {
    void play(String audioType, String fileName);
}

interface AdvancedMediaPlayer {
    void playVlc(String fileName);
    void playMp4(String fileName);
}

// 实现类
class VlcPlayer implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        System.out.println("Playing vlc file. Name: " + fileName);
    }

    @Override
    public void playMp4(String fileName) {
        // 什么也不做
    }
}

class Mp4Player implements AdvancedMediaPlayer {
    @Override
    public void playVlc(String fileName) {
        // 什么也不做
    }

    @Override
    public void playMp4(String fileName) {
        System.out.println("Playing mp4 file. Name: " + fileName);
    }
}

// 适配器类
class MediaAdapter implements MediaPlayer {
    AdvancedMediaPlayer advancedMediaPlayer;

    public Media