Java-设计模式

leard 发布于 2025-06-11 3 次阅读


策略模式

是一种行为模式,可以避免使用大量的if else、switch。

组成

  • 策略的通用接口
  • 具体策略的实现
  • 调用具体策略
// 策略接口
interface Strategy {
    void execute();
}

// 具体策略A
class ConcreteStrategyA implements Strategy {
    @Override
    public void execute() {
        System.out.println("Executing Strategy A");
    }
}

// 具体策略B
class ConcreteStrategyB implements Strategy {
    @Override
    public void execute() {
        System.out.println("Executing Strategy B");
    }
}

// 上下文类
class Context {
    private Strategy strategy;

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void executeStrategy() {
        if (strategy != null) {
            strategy.execute();
        } else {
            System.out.println("No strategy set");
        }
    }
}

// 客户端
public class Main {
    public static void main(String[] args) {
        Context context = new Context();

        Strategy strategyA = new ConcreteStrategyA();
        Strategy strategyB = new ConcreteStrategyB();

        context.setStrategy(strategyA);
        context.executeStrategy(); // Output: Executing Strategy A

        context.setStrategy(strategyB);
        context.executeStrategy(); // Output: Executing Strategy B
    }
}

模板方法模式

是一种行为模式,在抽象类中定义业务逻辑的骨架,具体步骤由子类实现,达到代码复用和拓展的目的。

组成

  • 定义模板抽象方法
  • 实现抽象方法
  • 调用
// 抽象类
abstract class DataProcessor {
    // 模板方法
    public final void process() {
        readData();
        processData();
        writeData();
    }

    protected abstract void readData(); // 读取数据
    protected abstract void processData(); // 处理数据

    protected void writeData() { // 写入数据
        System.out.println("Writing data to output.");
    }
}

// 具体实现类A
class CSVDataProcessor extends DataProcessor {
    @Override
    protected void readData() {
        System.out.println("Reading data from CSV file.");
    }

    @Override
    protected void processData() {
        System.out.println("Processing CSV data.");
    }
}

// 具体实现类B
class JSONDataProcessor extends DataProcessor {
    @Override
    protected void readData() {
        System.out.println("Reading data from JSON file.");
    }

    @Override
    protected void processData() {
        System.out.println("Processing JSON data.");
    }
}

// 客户端
public class Main {
    public static void main(String[] args) {
        DataProcessor csvProcessor = new CSVDataProcessor();
        csvProcessor.process();

        DataProcessor jsonProcessor = new JSONDataProcessor();
        jsonProcessor.process();
    }
}

单例模式

常见的实现方式

  • 饿汉式:类加载时就创建,线程安全,但是有可能会浪费资源
    • public class Singleton {
      private static final Singleton instance = new Singleton();
      private Singleton() {}

      public static Singleton getInstance() {
      return instance;
      }
      }
  • 懒汉式:首次访问时创建,节约资源,但是线程不安全
    • public class Singleton {
      private static Singleton instance;
      private Singleton() {}

      public static Singleton getInstance() {
      if (instance == null) {
      instance = new Singleton();
      }
      return instance;
      }
      }
  • 双重检查锁定:在懒汉式的基础上优化,只在第一次检查实例为空时加锁
    • public class Singleton {
      private static volatile Singleton instance;
      private Singleton() {}

      public static Singleton getInstance() {
      if (instance == null) {
      synchronized (Singleton.class) {
      if (instance == null) {
      instance = new Singleton();
      }
      }
      }
      return instance;
      }
      }
  • 静态内部类:利用类加载机制,实现懒加载和线程安全
    • public class Singleton {
      private Singleton() {

      }
      private static class Holder {

      private static final Singleton INSTANCE = new Singleton();
      }
      public static Singleton getInstance() {
      return Holder.INSTANCE; }
      }
  • 枚举单例:通过枚举实现单例
    • public enum Singleton {
      INSTANCE;
      public void bizMethod() { // 一些业务逻辑方法 }
      }
      //使用
      Singleton singleton = Singleton.INSTANCE;
      singleton.bizMethod();