设计模式是一种被反复验证的、可重复使用的解决方案,它可用于解决软件开发过程中的一些常见问题。在程序开发中,设计模式可以提高代码的可维护性、可读性和可复用性,并且可以减少开发过程中的错误。本文将介绍几种常用的设计模式,并提供示例以帮助读者更好地理解。
1. 创建型设计模式
1.1. 单例模式(Singleton)
单例模式是一种创建型设计模式,它限制一个类只能有一个实例,并提供一个全局访问点。这种模式通常用于管理全局资源或跟踪某个对象的状态。以下是一个简单的示例:
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
1.2. 工厂模式(Factory)
工厂模式是一种创建型设计模式,它提供了一种将对象的创建逻辑与使用者分离的方法。工厂模式可以根据特定的条件创建不同的对象,并将其返回给调用者。以下是一个简单的示例:
public interface Shape {
void draw();
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a rectangle.");
}
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing a circle.");
}
}
public class ShapeFactory {
public Shape createShape(String shapeType) {
if (shapeType.equalsIgnoreCase("rectangle")) {
return new Rectangle();
} else if (shapeType.equalsIgnoreCase("circle")) {
return new Circle();
} else {
throw new IllegalArgumentException("Unsupported shape type.");
}
}
}
2. 结构型设计模式
2.1. 适配器模式(Adapter)
适配器模式是一种结构型设计模式,它允许将不兼容的接口转换为客户端所期望的接口。适配器模式通常用于集成两个或更多不兼容的系统或类。以下是一个简单的示例:
public interface MediaPlayer {
void play(String audioType, String fileName);
}
public interface AdvancedMediaPlayer {
void playMp4(String fileName);
void playAvi(String fileName);
}
public class Mp4Player implements AdvancedMediaPlayer {
@Override
public void playMp4(String fileName) {
System.out.println("Playing mp4 file: " + fileName);
}
@Override
public void playAvi(String fileName) {
}
}
public class AviPlayer implements AdvancedMediaPlayer {
@Override
public void playMp4(String fileName) {
}
@Override
public void playAvi(String fileName) {
System.out.println("Playing avi file: " + fileName);
}
}
public class MediaAdapter implements MediaPlayer {
private AdvancedMediaPlayer advancedMediaPlayer;
public MediaAdapter(String audioType) {
if (audioType.equalsIgnoreCase("mp4")) {
advancedMediaPlayer = new Mp4Player();
} else if (audioType.equalsIgnoreCase("avi")) {
advancedMediaPlayer = new AviPlayer();
}
}
@Override
public void play(String audioType, String fileName) {
if (audioType.equalsIgnoreCase("mp4")) {
advancedMediaPlayer.playMp4(fileName);
} else if (audioType.equalsIgnoreCase("avi")) {
advancedMediaPlayer.playAvi(fileName);
}
}
}
public class AudioPlayer implements MediaPlayer {
private MediaAdapter mediaAdapter;
@Override
public void play(String audioType, String fileName) {
if (audioType.equalsIgnoreCase("mp3")) {
System.out.println("Playing mp3 file: " + fileName);
} else if (audioType.equalsIgnoreCase("mp4") || audioType.equalsIgnoreCase("avi")) {
mediaAdapter = new MediaAdapter(audioType);
mediaAdapter.play(audioType, fileName);
} else {
System.out.println("Unsupported audio type: " + audioType);
}
}
}
3. 行为型设计模式
3.1. 观察者模式(Observer)
观察者模式是一种行为型设计模式,它定义了一种一对多的依赖关系,使得一个对象在状态发生改变时能够自动通知其他依赖于它的对象。观察者模式常用于实现事件驱动的系统。以下是一个简单的示例:
public interface Observer {
void update(String message);
}
public interface Subject {
void attach(Observer observer);
void detach(Observer observer);
void notifyObservers(String message);
}
public class Blog implements Subject {
private List<Observer> observers = new ArrayList<>();
private String message;
@Override
public void attach(Observer observer) {
observers.add(observer);
}
@Override
public void detach(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(String message) {
for (Observer observer : observers) {
observer.update(message);
}
}
public void setMessage(String message) {
this.message = message;
notifyObservers(message);
}
}
public class User implements Observer {
private String name;
public User(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " received a new message: " + message);
}
}
以上只是介绍了一些常用的设计模式,实际上还有很多其他的设计模式可以用于不同的场景和问题。在实际开发中,选择适当的设计模式可以提高代码的复用性和可维护性,并且有助于更好地组织和设计软件系统。
希望本文对您理解程序开发中常用的设计模式有所帮助!
本文来自极简博客,作者:深海里的光,转载请注明原文链接:程序开发中常用的设计模式介绍