项目里用到了哪些设计模式是怎么使用的?

news/2025/1/1 0:06:29/

在软件开发项目中,设计模式是解决特定问题的通用模板或最佳实践。它们提供了一种经过验证的方式来组织代码,使其更易于理解、维护和扩展。下面我将详细介绍一些常见的设计模式及其在项目中的应用方式。

1. 单例模式(Singleton Pattern)

应用场景:确保一个类只有一个实例,并提供全局访问点。

  • 实现方式:通过私有化构造函数防止外部直接创建对象,使用静态方法返回唯一实例。
  • 项目应用:例如配置管理器、日志记录器等需要保证在整个应用程序生命周期内只存在单个实例的服务组件。
public class ConfigManager {private static final ConfigManager instance = new ConfigManager();// 私有化构造函数private ConfigManager() {}public static ConfigManager getInstance() {return instance;}
}

2. 工厂方法模式(Factory Method Pattern)

应用场景:定义一个用于创建对象的接口,让子类决定实例化哪一个类。

  • 实现方式:定义一个工厂接口或抽象类,其中包含创建产品的方法;具体工厂负责实现该方法以生成相应的产品。
  • 项目应用:用于处理不同类型的对象创建逻辑,如数据库连接池可以根据配置选择不同的驱动程序。
// 抽象工厂
public abstract class DatabaseFactory {public abstract Connection createConnection();
}// 具体工厂
public class MySQLFactory extends DatabaseFactory {@Overridepublic Connection createConnection() {return DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "user", "password");}
}

3. 抽象工厂模式(Abstract Factory Pattern)

应用场景:当一组相关联的对象需要一起使用时,可以提供一个接口来创建这些对象。

  • 实现方式:定义一个抽象工厂接口,包含多个创建不同类型产品的抽象方法;具体工厂则实现了这些方法来创建一系列相关的具体产品。
  • 项目应用:适用于构建复杂的系统,比如图形用户界面库可能需要根据不同操作系统创建相应的窗口、按钮等控件。
// 抽象工厂接口
public interface GUIFactory {Button createButton();Checkbox createCheckbox();
}// 具体工厂 - Windows风格
public class WinFactory implements GUIFactory {@Overridepublic Button createButton() { /* ... */ }@Overridepublic Checkbox createCheckbox() { /* ... */ }
}// 客户端代码
GUIFactory factory = new WinFactory();
Button button = factory.createButton();
Checkbox checkbox = factory.createCheckbox();

4. 原型模式(Prototype Pattern)

应用场景:当需要频繁创建大量相似的对象时,可以通过复制已有对象来节省资源。

  • 实现方式:定义一个原型接口,要求所有可克隆的对象都实现此接口并提供clone()方法。
  • 项目应用:游戏开发中经常用到原型模式快速生成敌人或其他重复性高的实体。
public interface Prototype {Prototype clone();
}public class Enemy implements Prototype {private String type;public Enemy(String type) {this.type = type;}@Overridepublic Prototype clone() {try {return (Enemy) super.clone();} catch (CloneNotSupportedException e) {return null;}}
}

5. 建造者模式(Builder Pattern)

应用场景:构建复杂对象时避免过多参数化的构造函数。

  • 实现方式:分离对象的构建过程与表示形式,允许同一构建过程创建不同表示的对象。
  • 项目应用:适合于需要逐步设置多个属性才能完成初始化的对象,如HTML文档生成器。
public class HtmlDocument {private String title;private List<String> paragraphs;public static class Builder {private final String title;private final List<String> paragraphs = new ArrayList<>();public Builder(String title) {this.title = title;}public Builder addParagraph(String text) {paragraphs.add(text);return this;}public HtmlDocument build() {return new HtmlDocument(this);}}private HtmlDocument(Builder builder) {this.title = builder.title;this.paragraphs = builder.paragraphs;}
}// 使用建造者模式创建对象
HtmlDocument doc = new HtmlDocument.Builder("My Document").addParagraph("First paragraph.").addParagraph("Second paragraph.").build();

6. 观察者模式(Observer Pattern)

应用场景:建立一对多依赖关系,当一个对象状态改变时,所有依赖它的对象都会收到通知并自动更新。

  • 实现方式:定义观察者接口,主体对象维护一个观察者列表,每当状态发生变化时就遍历列表调用每个观察者的更新方法。
  • 项目应用:UI框架中广泛使用的事件监听机制就是一个典型的例子。
public interface Observer {void update(float temperature, float humidity, float pressure);
}public class WeatherData {private List<Observer> observers = new ArrayList<>();private float temperature;private float humidity;private float pressure;public void registerObserver(Observer o) {observers.add(o);}public void measurementsChanged() {notifyObservers();}public void notifyObservers() {for (Observer observer : observers) {observer.update(temperature, humidity, pressure);}}
}

7. 策略模式(Strategy Pattern)

应用场景:定义一系列算法,并将每个算法封装起来,使它们可以互换。

  • 实现方式:定义一个策略接口,具体策略类实现该接口的不同行为;上下文对象持有对策略对象的引用,在运行时根据需求动态切换策略。
  • 项目应用:支付网关可以选择不同的支付方式(信用卡、PayPal等),或者排序算法可以根据数据集大小选择最合适的排序方法。
// 策略接口
public interface PaymentStrategy {void pay(double amount);
}// 具体策略 - 信用卡支付
public class CreditCardPayment implements PaymentStrategy {@Overridepublic void pay(double amount) {System.out.println("Paid " + amount + " using credit card.");}
}// 上下文对象
public class ShoppingCart {private PaymentStrategy paymentStrategy;public void setPaymentStrategy(PaymentStrategy strategy) {this.paymentStrategy = strategy;}public void checkout(double totalAmount) {paymentStrategy.pay(totalAmount);}
}// 使用策略模式进行支付
ShoppingCart cart = new ShoppingCart();
cart.setPaymentStrategy(new CreditCardPayment());
cart.checkout(100.0);

总结

以上只是部分常用的设计模式及其简单示例。实际上,在实际项目中可能会结合多种模式来解决问题,而且同一个模式也可以有多种形式的表现。重要的是理解每种模式背后的核心思想,并灵活运用到具体的业务场景中去。


http://www.ppmy.cn/news/1559174.html

相关文章

linux 7.6安装mysql 8.0步骤如下

linux 7.6安装mysql 8.0步骤如下&#xff1a; 注意&#xff1a;在导入密钥的时候这个不行&#xff0c;可更换为 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023

[Wireshark] 使用Wireshark抓包https数据包并显示为明文、配置SSLKEYLOGFILE变量(附下载链接)

wireshark 下载链接&#xff1a;https://pan.quark.cn/s/eab7f1e963be 提取码&#xff1a;rRAg 链接失效&#xff08;可能会被官方和谐&#xff09;可评论或私信我重发 chrome与firefox在访问https网站的时候会将密钥写入这个环境变量SSLKEYLOGFILE中&#xff0c;在wireshark…

Linux下C++轻量级WebServer服务器 框架梳理

前言 WebServer是一个很好的入门级C项目&#xff0c;因为它涉及到了方方面面&#xff0c;不仅可以提高编程能力&#xff0c;还包括了操作系统、计算机网络、数据库等方面的知识&#xff0c;所以我很推荐大家去入手这个项目。说细一点这个项目包含系统编程、日志系统、线程池、…

Day1 微服务 单体架构、微服务架构、微服务拆分、服务远程调用、服务注册和发现Nacos、OpenFeign

目录 1.导入单体架构项目 1.1 安装mysql 1.2 后端 1.3 前端 2.微服务 2.1 单体架构 2.2 微服务 2.3 SpringCloud 3.微服务拆分 3.1 服务拆分原则 3.1.1 什么时候拆 3.1.2 怎么拆 3.2 拆分购物车、商品服务 3.2.1 商品服务 3.2.2 购物车服务 3.3 服务调用 3.3.1 RestTemplate 3.…

PyQt实战——将pcm文本数据转换成.pcm的二进制文件

系类往期文章&#xff1a; PyQt5实战——多脚本集合包&#xff0c;前言与环境配置&#xff08;一&#xff09; PyQt5实战——多脚本集合包&#xff0c;UI以及工程布局&#xff08;二&#xff09; PyQt5实战——多脚本集合包&#xff0c;程序入口QMainWindow&#xff08;三&…

Android `android.graphics.drawable` 包深度解析:架构与设计模式

Android android.graphics.drawable 包深度解析:架构与设计模式 目录 引言Drawable 概述Drawable 的架构 Drawable 类层次结构Drawable 的核心方法Drawable 的设计模式 装饰者模式工厂模式状态模式常用 Drawable 子类解析 BitmapDrawableShapeDrawableLayerDrawableStateList…

智能流程管理:CRM系统助力订单与回款自动化

在现代企业管理中&#xff0c;客户关系管理&#xff08;CRM&#xff09;系统不仅仅是客户信息的存储库&#xff0c;更是企业运营效率提升的关键工具。通过实现订单到回款的自动化管理&#xff0c;CRM系统能够帮助企业减少人为错误&#xff0c;提高响应速度&#xff0c;优化现金…

【JDBC】使用原生JDBC,数据量很大且内存空间较小的情况下,JavaHeap溢出

文章目录 使用原生JDBC&#xff0c;数据量很大且内存空间较小的情况下&#xff0c;JavaHeap非常容易溢出问题背景java.lang.OutOfMemoryError: Java heap space错误分析解决方案1. **优化数据库查询**2. **调整 JVM 堆内存**3. **批量处理数据**4. **线程池优化** 总结**Result…