type
status
date
slug
summary
tags
category
icon
password
这里写文章的前言:
Dart 语言提供了一系列的运算符和编程机制,使得开发者能够以简洁、高效的方式编写代码。
Flutter开发04-设计模式基础
本文主要探索一些在Flutter开发中常用的设计模式。
Flutter 开发中,合理使用设计模式能让你的代码更健壮、更易维护。除了工厂模式(包括工厂方法和抽象工厂)和单例模式,还有其他一些非常实用的模式。
下面是一个表格汇总了 Flutter 中常用的设计模式及其核心应用场景:
设计模式 | 核心思想 | Flutter 中的典型应用场景 |
单例 (Singleton) | 确保一个类只有一个实例,提供全局访问点。 | 全局配置管理、日志记录器、网络请求客户端、共享状态(如用户登录状态)。 |
工厂方法 (Factory Method) | 定义一个创建对象的接口,但让子类决定实例化哪个类。 | 根据条件创建不同类型的小部件或对象,避免在代码中直接使用大量条件判断。 |
抽象工厂 (Abstract Factory) | 提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。 | 创建整套UI主题组件、跨平台适配(如 Material 与 Cupertino 风格切换)。 |
观察者 (Observer) | 定义对象间的一种一对多的依赖关系,当一个对象状态改变时,所有依赖它的对象都得到通知并自动更新。 | Flutter 响应式状态管理的核心(如 ChangeNotifier、ValueNotifiable),处理用户登录状态、网络连接状态等。 |
适配器 (Adapter) | 将一个类的接口转换成客户期望的另一个接口,使接口不兼容的类可以协同工作。 | 封装第三方库或原生平台代码使其更易使用,统一不同数据源的接口。 |
策略 (Strategy) | 定义一系列算法,将它们封装起来,并使它们可以互相替换,让算法的变化独立于使用算法的客户。 | 动态切换算法或行为(如排序算法、图片加载策略、支付方式选择)。 |
装饰器 (Decorator) | 动态地给一个对象添加一些额外的职责,就增加功能来说,比生成子类更为灵活。 | 在不改变原有对象的情况下,为 Widget 添加边框、阴影、点击效果等。 |
下面我们看一些代码例子和场景分析。
💡 单例模式 (Singleton)
确保一个类只有一个实例,并提供一个访问它的全局点。
使用场景:单例模式非常适合管理全局状态或资源,例如:
- 应用配置:如 API 地址、应用主题、语言设置等。
- 日志记录器:整个应用使用同一个日志记录实例。
- 网络请求客户端:管理全局的请求配置和拦截器。
- 数据库助手:管理对本地数据库的访问,避免多次打开连接。
- 共享状态:如用户登录状态、购物车等。
注意:虽然单例很方便,但要避免滥用,因为它会引入全局状态,可能使测试变得困难并隐藏了组件的依赖关系。
🔧 工厂模式 (Factory)
工厂模式包括工厂方法模式 (Factory Method) 和抽象工厂模式 (Abstract Factory)。
1. 工厂方法模式 (Factory Method)
定义一个用于创建对象的接口,但让子类决定实例化哪一个类。
使用场景:
- 根据条件创建不同风格的 Widget:如根据用户类型显示不同的按钮或卡片。
- 封装复杂对象的创建过程:当对象的创建需要一系列步骤时,可以用工厂方法封装。
2. 抽象工厂模式 (Abstract Factory)
提供一个接口,用于创建相关或依赖对象的家族,而不需要指定具体类。它强调创建一系列相关产品。
使用场景:
- 主题系统:确保一套 UI 组件(按钮、对话框、文本框)具有统一的风格。
- 跨平台适配:为 Android 和 iOS 平台提供不同风格的组件。
- 数据源切换:创建一系列相关的数据访问对象(如网络请求、本地数据库存储)。
🔍 观察者模式 (Observer)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这是 Flutter 响应式编程和状态管理的核心。
Flutter 中的
ValueNotifier和 ChangeNotifier是观察者模式的典型实现。使用场景:
- 状态管理:这是 Flutter 中最常见的用途。像
Provider、Riverpod、GetX等状态管理库的核心都基于观察者模式,用于管理用户登录状态、网络连接状态、主题切换等。
- 事件总线:实现组件间的松散耦合通信。
🔄 适配器模式 (Adapter)
将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以一起工作。
使用场景:
- 封装第三方库:使第三方库的接口更符合自己项目的使用习惯,未来更换库时只需修改适配器。
- 统一数据接口:将不同来源(网络、本地数据库、缓存)的数据转换为统一的格式供 UI 使用。
- 兼容旧代码:在新系统中需要与旧接口协同工作时。
🎯 策略模式 (Strategy)
定义一系列算法,将它们封装起来,并使它们可以互相替换,使得算法可以独立于使用它的客户而变化。
使用场景:
- 支付方式选择:用户可以在信用卡、支付宝、微信支付等不同策略间切换。
- 图片加载策略:根据网络情况动态选择加载原图或缩略图的策略。
- 排序算法:在不同的排序算法(如快速排序、归并排序)间灵活切换。
- 数据验证规则:针对不同类型的输入(邮箱、手机号、密码)使用不同的验证策略。
✨ 装饰器模式 (Decorator)
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
在 Dart 语言中,
Stream的很多方法(如 map, where, take)都返回新的 Stream,可以看作是装饰器模式的应用。在 Flutter 中,许多 Widget 的设计也体现了装饰器模式的思想:
使用场景:
- 动态扩展对象功能:在不修改原有对象结构的情况下,动态地添加功能或责任。
- Widget 装饰:为现有的 Widget 添加边框、背景、圆角、 padding 等,如
Container,Padding,DecoratedBox等 Widget 都扮演了装饰器的角色。
- 主题和样式:为组件应用主题样式。
如何选择设计模式
选择设计模式时,考虑以下几点:
- 项目规模与复杂度:小型项目或原型开发可能用 MVC 或简单工厂就够了。大型复杂应用,尤其是状态交互频繁的,更适合 BLoC 或 MVVM。
- 团队熟悉度:选择团队熟悉且能熟练运用的模式,能提高开发效率和代码质量。
- 测试需求:BLoC 等模式因逻辑与UI分离,可测试性通常更好。
- 避免过度设计:如果需求很简单,强行套用复杂模式反而会让代码难以理解。
总结
设计模式是解决特定问题的经验总结,关键是理解其思想而非死记硬背。在 Flutter 开发中:
- 熟练使用 单例、工厂、观察者 模式是基础。
- 根据需求灵活运用适配器、策略、装饰器等模式能提升代码质量。
- 结合 MVVM、BLoC 等架构模式(它们常由多个设计模式组合而成)来组织整个应用。
希望这些解释和例子能帮助你更好地理解和应用设计模式。
Loading...

