设计模式是针对特定问题或者场景的最佳实践。设计模式能够提供一些通用的解决方案,旨在提高可重用性、灵活性、安全性和可维护性等。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类作为客户端来使用适配器对象。