您的位置:

Java设计模式

设计模式是针对特定问题或者场景的最佳实践。设计模式能够提供一些通用的解决方案,旨在提高可重用性、灵活性、安全性和可维护性等。Java是一种强大的编程语言,已经成为企业级应用程序的首选。设计模式和Java的结合使得程序员能够开发高效、可扩展和复用的代码,也使得Java程序员更容易理解和使用设计模式。

一、单例模式(Singleton Pattern)

单例模式是一种创建性设计模式,用于确保类的对象只能创建一次,并且任何人都无法通过直接创建新对象来对其进行更改。在Java中,可以通过私有构造函数和私有静态变量来实现单例模式。

public class Singleton {

  private static Singleton instance;

  private Singleton() {}

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

}

此处的单例模式使用了“懒汉式”单例模式,只有在需要时才会创建对象。getInstance()方法使用synchronized关键字进行同步,确保线程安全。

二、工厂模式(Factory Pattern)

工厂模式是一种创建型设计模式,旨在提供一种通用接口来创建对象。在Java中,可以使用接口、抽象类或者基类作为工厂模式中的通用接口。通过工厂模式,我们能够将对象的创建过程封装起来,使得程序员可以更加集中地关注业务逻辑。

public interface Shape {
  void draw();
}

public class Circle implements Shape {

  @Override
  public void draw() {
    System.out.println("Circle.draw()");
  }

}

public class Square implements Shape {

  @Override
  public void draw() {
    System.out.println("Square.draw()");
  }

}

public class ShapeFactory {

  public Shape createShape(String type) {
    if (type.equalsIgnoreCase("Circle")) {
      return new Circle();
    } else if (type.equalsIgnoreCase("Square")) {
      return new Square();
    } else {
      return null;
    }
  }

}

此处的工厂模式使用抽象类Shape作为通用接口,ShapeFactory类则提供了公共的createShape()方法来创建不同类型的Shape对象。

三、观察者模式(Observer Pattern)

观察者模式是一种行为性设计模式,用于构建一种通知机制,允许一个对象在状态发生变化时通知一组依赖于它的其他对象。在Java中,可以使用Observer和Observable类来实现观察者模式。

import java.util.*;

public class WeatherData extends Observable {

  private float temperature;
  private float humidity;
  private float pressure;

  public void measurementsChanged() {
    setChanged();
    notifyObservers();
  }

  public void setMeasurements(float temp, float humidity, float pressure) {
    this.temperature = temp;
    this.humidity = humidity;
    this.pressure = pressure;
    measurementsChanged();
  }

}

public class CurrentConditionsDisplay implements Observer {

  private float temperature;
  private float humidity;

  public void update(Observable obs, Object arg) {
    if (obs instanceof WeatherData) {
      WeatherData wd = (WeatherData)obs;
      this.temperature = wd.getTemperature();
      this.humidity = wd.getHumidity();
      display();
    }
  }

  public void display() {
    System.out.println("Current conditions: " + temperature + "F degrees and " + humidity + "% humidity");
  }

}

此处的观察者模式使用WeatherData类作为主题对象,CurrentConditionsDisplay类作为观察者对象。当WeatherData对象的状态发生变化时,会通知所有注册的观察者对象。

四、适配器模式(Adapter Pattern)

适配器模式是一种结构型设计模式,允许一个对象将其接口转换为另一个对象可以接受的接口。在Java中,适配器模式可以使用类适配器或者对象适配器进行实现。

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 {

  public void playVlc(String fileName) {
    System.out.println("Playing vlc file. Name: " + fileName);
  }

  public void playMp4(String fileName) {
    // do nothing
  }

}

public class Mp4Player implements AdvancedMediaPlayer {

  public void playVlc(String fileName) {
    // do nothing
  }

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

}

public class MediaAdapter implements MediaPlayer {

  AdvancedMediaPlayer advancedMusicPlayer;

  public MediaAdapter(String audioType){
    if(audioType.equalsIgnoreCase("vlc")){
      advancedMusicPlayer = new VlcPlayer();
    } else if (audioType.equalsIgnoreCase("mp4")){
      advancedMusicPlayer = new Mp4Player();
    }
  }

  public void play(String audioType, String fileName) {
    if(audioType.equalsIgnoreCase("vlc")){
      advancedMusicPlayer.playVlc(fileName);
    }else if(audioType.equalsIgnoreCase("mp4")){
      advancedMusicPlayer.playMp4(fileName);
    }
  }

}

public class AudioPlayer implements MediaPlayer {

  MediaAdapter mediaAdapter;

  public void play(String audioType, String fileName) {

    if(audioType.equalsIgnoreCase("mp3")){
      System.out.println("Playing mp3 file. Name: " + fileName);
    } else if(audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")){
      mediaAdapter = new MediaAdapter(audioType);
      mediaAdapter.play(audioType, fileName);
    } else{
      System.out.println("Invalid media. " + audioType + " format not supported");
    }
  }

}

此处的适配器模式将AdvancedMediaPlayer接口适配成为MediaPlayer接口,这样MediaPlayer对象就可以播放不同类型的音频文件了。AudioPlayer类作为客户端来使用适配器对象。