Java设计模式教程
1409字约5分钟
Java设计模式开发规范架构设计
2025-08-18
设计模式基础概念
设计模式是在软件设计中常见问题的可重用解决方案。它们不是可以直接转换为代码的完成设计,而是描述了在特定情况下解决设计问题的方法。
设计模式的主要优势包括:
- 提高代码质量:提供经过验证的解决方案
- 促进代码重用:提供通用的解决方案模板
- 提高开发效率:减少设计和实现时间
- 改善沟通:提供通用的术语和概念
设计模式通常分为三类:
- 创建型模式:处理对象的创建过程
- 结构型模式:处理类或对象的组合
- 行为型模式:处理对象间职责的分配和通信
单例模式(Singleton Pattern)
单例模式确保一个类只有一个实例,并提供全局访问点。这是最常用的设计模式之一。
实现要点
- 私有构造方法防止外部实例化
- 静态变量保存唯一实例
- 静态方法提供全局访问点
- 线程安全的实现方式
public class Singleton {
private static volatile Singleton instance;
private Singleton() {
// 防止通过反射创建实例
if (instance != null) {
throw new RuntimeException("使用getSingleton()方法获取实例");
}
}
public static Singleton getSingleton() {
// 双重检查锁定确保线程安全
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}使用场景
- 配置管理器
- 日志记录器
- 数据库连接池
- 线程池
工厂模式(Factory Pattern)
工厂模式定义一个创建对象的接口,但让子类决定实例化哪个类。工厂方法让类的实例化推迟到子类。
实现要点
- 定义产品接口
- 实现具体产品类
- 创建工厂类负责创建产品对象
// 产品接口
public interface Shape {
void draw();
}
// 具体产品
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("绘制圆形");
}
}
// 工厂类
public class ShapeFactory {
public Shape getShape(String shapeType) {
if (shapeType == null) {
return null;
}
if (shapeType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
}
return null;
}
}使用场景
- 创建复杂对象
- 需要根据不同条件创建不同对象
- 系统应该独立于产品的创建、组合和表示
观察者模式(Observer Pattern)
观察者模式定义了对象间的一对多依赖关系,当一个对象改变状态时,所有依赖它的对象都会收到通知并自动更新。
实现要点
- 定义主题接口和观察者接口
- 实现具体主题和观察者类
- 建立订阅和通知机制
// 主题接口
public interface Subject {
void registerObserver(Observer observer);
void removeObserver(Observer observer);
void notifyObservers();
}
// 观察者接口
public interface Observer {
void update(String message);
}
// 具体主题
public class NewsAgency implements Subject {
private List<Observer> observers;
private String news;
public void setNews(String news) {
this.news = news;
notifyObservers();
}
@Override
public void notifyObservers() {
for (Observer observer : observers) {
observer.update(news);
}
}
// 其他方法...
}
// 具体观察者
public class NewsChannel implements Observer {
@Override
public void update(String news) {
System.out.println(name + " 收到新闻: " + news);
}
}使用场景
- 事件处理系统
- MVC架构中的模型和视图
- 发布-订阅系统
- 实时数据更新
其他常见设计模式
1. 装饰器模式(Decorator Pattern)
动态地给对象添加额外的职责,比生成子类更灵活。
2. 策略模式(Strategy Pattern)
定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。
3. 模板方法模式(Template Method Pattern)
定义一个操作中的算法骨架,而将一些步骤延迟到子类中。
4. 适配器模式(Adapter Pattern)
将一个类的接口转换成客户希望的另一个接口。
设计模式最佳实践
- 不要过度使用:设计模式是解决方案,不是万能药
- 理解模式适用场景:在合适的场景使用合适的模式
- 保持简单:避免不必要的复杂性
- 团队沟通:确保团队成员理解使用的模式
- 持续学习:不断学习新的设计模式和最佳实践
包结构说明
为了更好地组织代码,我们将设计模式相关的类按照模式类型分别放在不同的包中:
src/main/java/com/ibz/design/
├── DesignPatternDemo.java // 主类,包含演示方法
├── singleton/
│ └── Singleton.java // 单例模式示例
├── factory/
│ ├── Shape.java // 形状接口(工厂模式)
│ ├── Circle.java // 圆形类(工厂模式)
│ ├── Rectangle.java // 矩形类(工厂模式)
│ └── ShapeFactory.java // 形状工厂类(工厂模式)
└── observer/
├── Subject.java // 主题接口(观察者模式)
├── Observer.java // 观察者接口(观察者模式)
├── NewsAgency.java // 新闻机构类(观察者模式)
└── NewsChannel.java // 新闻频道类(观察者模式)要运行该程序,可以使用以下命令:
mvn compile
mvn exec:java -Dexec.mainClass="com.ibz.design.DesignPatternDemo"总结
设计模式是软件开发中的重要工具,掌握常见的设计模式有助于:
- 提高代码质量:使用经过验证的解决方案
- 增强代码可维护性:提供清晰的结构和职责分离
- 促进团队协作:提供通用的术语和概念
- 提高开发效率:减少重复设计和实现工作
在实际开发中,应该根据具体需求选择合适的设计模式,避免为了使用模式而使用模式。重要的是理解模式背后的原理和适用场景,灵活运用以解决实际问题。
