C++笔记之单例模式、工厂模式、观察者模式的适用场景是什么?
code review!
- 单例模式:系统中某个类只能有一个实例,且该实例需要被全局访问的场景。比如全局状态管理类、配置管理器、日志系统。
- 工厂模式:工厂模式适用于创建对象的过程比较复杂,或者需要根据不同条件创建不同类型的对象,并且希望将对象的创建与使用解耦的场景。另外简单工厂模式违反了开闭原则。但使用静态注册表可以解决这个问题。
- 观察者模式:观察者模式适用于一个对象状态改变时,需要通知一系列依赖该状态的对象,从而实现发布-订阅、事件驱动的场景。比如天气变化,超市涨价推送通知给用户。Qt的信号与槽、ROS的发布-订阅者机制就是在一定程度上应用了观察者的思想。
文章目录
- C++笔记之单例模式、工厂模式、观察者模式的适用场景是什么?
- 1. 三种设计模式的适用场景
- 1.1 单例模式适用于什么场景?
- 1.2 工厂模式适用于什么场景?
- 1.2.1 简单工厂模式适用于什么情况?
- 1.2.2 工厂方法模式适用于什么情况?
- 1.2.3 抽象工厂模式适用于什么情况?
- 1.3 观察者模式适用于什么场景?
- 1.4 三种模式如何对比?
- 2. 观察者模式的典型应用场景有没有天气变化、超市涨价、Qt信号与槽?
- 3. 观察者模式就是发布者和订阅者吗?
- 3.1 观察者模式的核心概念是什么?
- 3.2 观察者模式和发布-订阅模式有什么区别?
- 4. ROS和Qt的信号与槽机制都是观察者模式吗?
- 4.1 Qt信号与槽属于哪一类?
- 4.2 ROS的Topic机制属于哪一类?
- 4.3 两者的关键差异是什么?
- 4.4 如何一句话区分?
1. 三种设计模式的适用场景
1.1 单例模式适用于什么场景?
单例模式适用于系统中某个类只能有一个实例,且该实例需要被全局访问的场景。
典型应用包括:
- 全局状态管理类:系统需要唯一的状态持有者,避免多处各自维护一份状态导致不一致。
- 配置管理器:系统配置全局唯一,多处读取,同时避免重复加载。
- 日志系统:整个程序共享一个日志记录器,避免日志文件被多次打开。
- 线程池或连接池管理:资源池需要全局统一管理,防止创建多个池造成资源浪费。
- 硬件资源访问:例如打印机、显卡等独占资源的管理类。
1.2 工厂模式适用于什么场景?
工厂模式适用于创建对象的过程比较复杂,或者需要根据不同条件创建不同类型的对象,并且希望将对象的创建与使用解耦的场景。
1.2.1 简单工厂模式适用于什么情况?
适用于产品种类较少且相对固定,根据参数创建对应对象的情况。例如根据文件后缀创建不同的解析器,如 JsonParser、XmlParser。
1.2.2 工厂方法模式适用于什么情况?
适用于产品族会扩展,希望遵循开闭原则,新增产品时不修改已有代码的情况。例如日志系统支持文件日志、网络日志、控制台日志,每种日志对应一个具体工厂。