Java 设计模式 按顺序执行

设计模式是一种被广泛使用的软件开发技巧,它提供了一种解决常见问题的方式,同时也可以提高代码的可读性和可维护性。在 Java 开发中,有许多常见的设计模式可供选择,本文将按照一定的顺序介绍这些设计模式,并给出相应的代码示例。

1. 单例模式(Singleton Pattern)

单例模式是最简单且常用的设计模式之一。它确保一个类只有一个实例,并提供一个全局访问点。

public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // 私有构造函数,防止外部实例化
    }

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

在上述代码中,通过将构造函数设为私有,外部无法直接实例化 Singleton 类,只能通过 getInstance() 方法获取单例对象。

2. 工厂模式(Factory Pattern)

工厂模式用于创建对象,而不需要暴露对象的创建逻辑。它提供一个共同的接口,用于创建不同类型的对象。

public interface Shape {
    void draw();
}

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Drawing a rectangle");
    }
}

public class ShapeFactory {
    public Shape getShape(String shapeType) {
        if (shapeType.equalsIgnoreCase("Circle")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("Rectangle")) {
            return new Rectangle();
        }
        return null;
    }
}

在上述代码中,Shape 接口定义了一个 draw() 方法,CircleRectangle 类实现了 Shape 接口。ShapeFactory 类根据不同的形状类型返回相应的对象。

3. 原型模式(Prototype Pattern)

原型模式用于创建对象的克隆,而不需要通过实例化来创建新的对象。

public abstract class Shape implements Cloneable {
    private String id;
    protected String type;

    abstract void draw();

    public String getType() {
        return type;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public Object clone() {
        Object clone = null;
        try {
            clone = super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return clone;
    }
}

public class Circle extends Shape {
    public Circle() {
        type = "Circle";
    }

    @Override
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

public class Rectangle extends Shape {
    public Rectangle() {
        type = "Rectangle";
    }

    @Override
    public void draw() {
        System.out.println("Drawing a rectangle");
    }
}

public class ShapeCache {
    private static Map<String, Shape> shapeMap = new HashMap<>();

    public static Shape getShape(String shapeId) {
        Shape cachedShape = shapeMap.get(shapeId);
        return (Shape) cachedShape.clone();
    }

    public static void loadCache() {
        Circle circle = new Circle();
        circle.setId("1");
        shapeMap.put(circle.getId(), circle);

        Rectangle rectangle = new Rectangle();
        rectangle.setId("2");
        shapeMap.put(rectangle.getId(), rectangle);
    }
}

上述代码中,Shape 抽象类实现了 Cloneable 接口,并定义了一个抽象的 draw() 方法。CircleRectangle 类继承自 Shape 抽象类,并实现了 draw() 方法。ShapeCache 类用于缓存不同形状的对象,并提供 getShape() 方法用于获取对象的克隆。

4. 适配器模式(Adapter Pattern)

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

public interface MediaPlayer {
    void play(String audioType, String fileName);
}

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

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

    @Override