安卓开发用到的设计模式(1)创建型模式

安卓开发用到的设计模式(1)创建型模式

文章目录

  • 安卓开发用到的设计模式(1)创建型模式
    • 1. 单例模式(Singleton Pattern)
    • 2. 工厂模式(Factory Pattern)
    • 3. 抽象工厂模式(Abstract Factory Pattern)
    • 4. 建造者模式(Builder Pattern)
    • 5. 原型模式(Prototype Pattern)

本文首发地址 https://h89.cn/archives/397.html

1. 单例模式(Singleton Pattern)

单例模式确保一个类只有一个实例,并提供一个全局访问点。

在Android中的主要应用场景:

  1. 系统服务 (System Services)

    • SystemService的获取: Android系统中的各种服务(如 LayoutInflater, WindowManager, ActivityManager 等)都是通过 Context.getSystemService() 方法获取的单例实例。这样做可以确保系统中只有一个服务实例在运行,节省资源并保证状态一致性。
    • 确保系统服务的唯一性: 例如,LocationManager 负责管理设备的位置信息,如果允许创建多个实例,可能会导致位置更新冲突或资源浪费。通过单例模式,系统确保所有组件都使用同一个 LocationManager 实例。
  2. 数据管理器 (Data Managers)

    • SharedPreferences管理器: 在应用中管理用户偏好设置时,通常会使用 SharedPreferences。为了避免频繁创建和销毁 SharedPreferences 实例,以及确保所有地方访问的是同一份配置数据,可以将其封装成一个单例管理器。
    • 数据库连接管理: 数据库连接是昂贵的资源。在Android应用中,为了高效地管理数据库访问,通常会将 SQLiteOpenHelper 或 Room Database 的实例设计成单例,确保应用生命周期内只有一个数据库连接池或数据库实例,从而优化性能和资源使用。

2. 工厂模式(Factory Pattern)

工厂模式提供了一种创建对象的最佳方式,在创建对象时不会对客户端暴露创建逻辑。

在Android中的主要应用场景:

  1. Fragment创建 (Fragment Creation)

    • FragmentFactory: 在现代Android开发中,FragmentFactory 提供了一种机制来控制 Fragment 的实例化过程。通过自定义 FragmentFactory,可以在创建 Fragment 时注入依赖,或者根据特定条件创建不同的 Fragment 子类,而无需在调用方暴露具体的创建逻辑。
    • 统一管理Fragment的实例化: 当 Fragment 的创建过程变得复杂(例如需要传递特定的参数或依赖)时,使用工厂模式可以将创建逻辑集中管理,使得调用方只需通过工厂接口请求 Fragment 实例,而不需要关心其内部创建细节。
  2. Intent服务 (Intent Services)

    • IntentService的创建: IntentService 是 Android 中用于处理异步任务的服务基类。虽然 IntentService 本身不是一个典型的工厂模式应用,但其启动方式 (startService(Intent)) 可以看作是一种简化的工厂方法调用,系统根据传入的 Intent 来创建并启动相应的服务实例,处理后台任务。

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

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

在Android中的主要应用场景:

  1. 主题系统 (Theme System)

    • 不同主题风格的UI组件创建: 抽象工厂模式非常适合用于实现 Android 的主题系统。例如,可以定义一个抽象工厂接口 UIComponentFactory,包含创建按钮、文本框等 UI 组件的方法。然后为不同的主题(如 LightTheme, DarkTheme)实现具体的工厂类,每个工厂类负责创建符合该主题风格的 UI 组件实例。这样,切换主题时只需切换使用的工厂实例,即可创建一套风格一致的 UI 组件族。
    • 确保UI组件风格的一致性: 通过抽象工厂,可以确保在同一主题下创建的所有 UI 组件都遵循该主题的设计规范,避免风格混杂。
    • 例如:Material Design中的Light/Dark主题组件族: Android 的 Material Design 主题系统就是抽象工厂模式的一个典型应用。开发者通过应用不同的主题,系统会使用对应的主题工厂来创建具有特定颜色、字体、形状等属性的 UI 元素。
  2. 数据访问层 (Data Access Layer)

    • 不同数据源的访问对象创建: 在一个应用中,数据可能来源于多种渠道,如本地数据库、网络 API、文件存储或内存缓存。可以定义一个抽象工厂 DataAccessFactory,包含 createDatabaseAccessor(), createNetworkAccessor(), createCacheAccessor() 等方法。然后为不同的数据源实现具体的工厂类(如 LocalDataFactory, RemoteDataFactory)。应用层通过抽象工厂接口获取数据访问对象,无需关心底层数据源的具体实现。
    • 统一管理数据访问接口: 抽象工厂模式提供了一个统一的接口来创建不同数据源的访问对象,使得数据访问逻辑更加模块化和易于管理。
    • 例如:本地存储、网络API、缓存等数据源的访问对象: 开发者可以根据当前环境或配置,使用不同的工厂来获取操作 SQLite 数据库、Retrofit 网络请求或 Room 数据库的访问对象。
  3. 多平台适配 (Multi-platform Adaptation)

    • 创建不同平台特定的组件: 虽然 Android 主要运行在移动设备上,但在处理不同 Android 版本或特定设备特性时,抽象工厂模式可以派上用场。例如,某些功能在不同 Android 版本上有不同的实现方式。可以定义一个抽象工厂 FeatureFactory,然后为不同的 Android 版本(如 Android 10, Android 11)实现具体的工厂类,每个工厂类创建符合该版本特性的功能组件。
    • 处理平台差异化实现: 通过抽象工厂,可以将平台相关的实现细节封装起来,使得应用的核心逻辑与平台差异性解耦。
    • 例如:不同Android版本的特性适配: 比如,某些权限管理或后台任务执行方式在不同 Android 版本之间有较大差异,可以使用抽象工厂来提供不同版本的适配器或实现类。

4. 建造者模式(Builder Pattern)

建造者模式是将一个复杂对象的构建过程与它的表示分离,使得同样的构建过程可以创建不同的表示。

在Android中的主要应用场景:

  1. Dialog的构建 (Dialog Construction)

    • AlertDialog.Builder: 这是 Android 中建造者模式最经典的例子之一。创建一个复杂的 AlertDialog 需要设置标题、消息、按钮、列表项等多个属性。AlertDialog.Builder 提供了一系列链式调用的方法(如 .setTitle(), .setMessage(), .setPositiveButton()),允许开发者逐步设置对话框的各个部分,最后通过 .create().show() 方法构建并显示对话框。这种方式使得对话框的构建过程清晰且灵活,避免了构造函数参数过多的问题。
    • 通过链式调用设置对话框的各个属性: 链式调用是建造者模式在代码实现上的常见表现形式,它使得构建过程读起来像一系列指令。
  2. Retrofit的配置 (Retrofit Configuration)

    • OkHttpClient.Builder: 在使用 Retrofit 进行网络请求时,通常需要配置底层的 OkHttpClientOkHttpClient.Builder 提供了丰富的配置选项,如设置超时时间、添加拦截器、配置缓存等。开发者可以通过 OkHttpClient.Builder 的链式调用方法来逐步构建符合需求的 OkHttpClient 实例,然后将其用于创建 Retrofit 实例。这同样体现了建造者模式在构建复杂对象时的优势。
    • 配置网络请求的各种参数: 通过 Builder 模式,可以将 OkHttpClient 的各种配置参数(如连接池、安全设置、事件监听器等)清晰地分离和组织起来。

5. 原型模式(Prototype Pattern)

原型模式是用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

在Android中的主要应用场景:

  1. Intent的克隆 (Intent Cloning)

    • Intent对象的复制: 在 Android 中,Intent 对象实现了 Parcelable 接口,可以通过序列化和反序列化来实现“克隆”。虽然不是严格意义上的原型模式(原型模式通常指通过 clone() 方法复制自身),但在概念上,通过复制一个现有的 Intent 实例来创建新的 Intent,并在此基础上进行修改(如添加或修改 Extra 数据),以启动不同的组件或传递不同的信息,这与原型模式通过复制原型创建新对象的思想是相符的。
    • 保持原有Intent的数据: 复制 Intent 可以保留其原有的动作、类别、数据 URI、Flags 以及 Extra 数据,方便在相似的场景下复用大部分配置。
  2. 配置对象的复制 (Configuration Object Copying)

    • 复制已有的配置信息: 在 Android 开发中,有时需要基于一个已有的配置对象(如网络请求配置、UI 样式配置等)创建新的配置对象,并在新对象上进行少量修改。如果配置对象比较复杂,包含多个字段,手动复制会很繁琐且容易出错。如果配置对象支持深拷贝或提供了复制方法,就可以利用原型模式的思想,快速创建一个与原型对象相同的新对象,然后在新的对象上进行修改,而不会影响到原型对象。
    • 在原有配置基础上修改: 这种模式特别适用于需要创建多个相似对象,但每个对象又有一些细微差别的场景,通过复制和修改比从头创建更加高效和便捷。

这些创建型设计模式在Android开发中的应用不仅能够提高代码的复用性和可维护性,还能使代码结构更加清晰。通过合理使用这些模式,我们可以更好地组织代码,提高开发效率,并且使应用程序更容易维护和扩展。在实际开发中,我们应该根据具体场景选择合适的设计模式,避免过度设计,确保代码的简洁性和可读性。


相关系列文章:

  • 安卓开发用到的设计模式(1)创建型模式
  • 安卓开发用到的设计模式(2)结构型模式
  • 安卓开发用到的设计模式(3)行为型模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

后端开发概念

1. 后端开发概念解析 1.1. 什么是服务器,后端服务 1.1.1. 服务器 服务器是一种提供服务的计算机系统,它可以接收、处理和响应来自其他计算机系统(客户端)的请求。服务器主要用于存储、处理和传输数据,以便客户端可以…

Spring AI 源码解析:Tool Calling链路调用流程及示例

Tool工具允许模型与一组API或工具进行交互,增强模型功能,主要用于: 信息检索:从外部数据源检索信息,如数据库、Web服务、文件系统或Web搜索引擎等 采取行动:可用于在软件系统中执行特定操作,如…

Spyglass:跨时钟域同步(长延迟信号)

相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 简介 长延迟信号方案用于控制或数据信号跨时钟域同步,该方案将使用quasi_static约束的跨时钟域信号视为已同步,如图1所示。 // test.sgdc q…

Linux云计算训练营笔记day13【CentOS 7 find、vim、vimdiff、ping、wget、curl、RPM、YUM】

Linux云计算训练营笔记day13[CentOS 7 find、vim、vimdiff、ping、wget、curl、RPM、YUM]] 目录 Linux云计算训练营笔记day13[CentOS 7 find、vim、vimdiff、ping、wget、curl、RPM、YUM]]1.find练习2.vim高级使用2.1 命令模式:2.2 插入模式:2.3 末行模式: 3. vimdiff4. ping5.…

网络流量分析工具ntopng的安装与基本使用

网络流量分析工具ntopng的安装与基本使用 一、ntopng基本介绍1.1 ntopng简介1.2 主要特点1.3 使用场景 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、安装ntopng工具3.1 官网地址3.2 配置软件源3.3 添加软件源3.4 安装ntopng 四、ntopng的基本配置4.1 修改配置文件4.…

数据的获取与读取篇---常见的数据格式JSON

文件格式 假如你有一份想分析的数据文件,获得文件后下一步就是用代码读取它。不同的文件格式有不同的读取方法。所以读取前了解文件格式也很重要。你可能见过非常多的文件格式,例如TXT、MP3、PDF、JPEG等等。 一般可以通过文件的后缀来分辨文件的格式,例如TXT格式,一般保存…

人工智能发展

探秘人工智能领域的热门编程语言与关键知识 在当今科技飞速发展的时代,人工智能已渗透到生活的各个角落,从智能语音助手到精准的推荐系统,从自动驾驶汽车到医疗影像诊断,人工智能正以前所未有的速度改变着世界。而在这背后&#x…

超全GPT-4o 风格提示词案例,持续更新中,附使用方式

本文汇集了各类4o风格提示词的精选案例,从基础指令到复杂任务,从创意写作到专业领域,为您提供全方位的参考和灵感。我们将持续更新这份案例集,确保您始终能够获取最新、最有效的提示词技巧。 让我们一起探索如何通过精心设计的提…

Vue3响应式数据: 深入分析Ref与Reactive

Vue3响应式数据: 深入分析Ref与Reactive 介绍 作为一个流行的前端框架,其响应式数据系统是其核心特性之一。在Vue3中,我们可以使用Ref和Reactive两种方式来创建响应式数据。本文将深入分析Ref与Reactive,帮助读者更好地理解Vue3的响应式数据系…

云计算,大数据,人工智能

1. 云计算:弹性资源与分布式计算 案例:基于AWS EC2的动态资源扩展 场景:电商网站在“双十一”期间流量激增,需要临时扩容服务器资源。 代码:使用AWS Boto3库动态启动EC2实例 import boto3# 创建EC2客户端 ec2 boto…

Linux(7)——进程(概念篇)

一、基本概念 书本上的概念:程序的一个执行实例,正在执行的程序等 基于内核的观点:担当分配系统资源(CPU时间,内存)的实体。 我们知道,我们在写代码的时候,你的代码进行编译链接后生成可执行文件&#xff…

【Harmony】【鸿蒙】List列表View如何刷新内部的自定义View的某一个控件

创建自定义View Component export struct TestView{State leftIcon?:Resource $r(app.media.leftIcon)State leftText?:Resource | string $r(app.string.leftText)State rightText?:Resource | string $r(app.string.rightText)State rightIcon?:Resource $r(app.med…

Docker安装MySQL集群(主从复制)

为确保生产环境中的数据安全与可靠性,数据库普遍采用主从集群架构(一主一从)进行部署。本文将系统阐述如何利用Docker镜像实现数据库集群的容器化部署,并完整记录各配置环节的具体实现步骤。 一、主服务实例创建(可以…

开篇:MCP理论理解和学习

文章目录 零 参考资料一 MCP概念二 MCP核心架构和功能三 MCP VS OP(Others Protocol)3.1 函数调用3.2 模型上下文协议3.3 MCP VS Others Protocol3.3.1 MCP与Function Calling的对比优势3.3.2 MCP与AI Agents的协同关系3.3.3 MCP与A2A协议的互补性3.3.4 MCP与传统API的技术革新…

产品经理面经(三)

目录 为什么想做产品经理?为什么适合做产品经理? 解析 我的回答: 你觉得产品经理应该具备什么品质 解析 我的回答 想做什么方向的产品经理呢&你知道产品经理分为哪几种吗? 解题思路 为什么想做产品经理?为…

Vue3 Composition API: 企业级应用最佳实践方案

在当前前端技术迅速发展的环境下,Vue3 Composition API 成为了关注的焦点。它为开发人员提供了更加灵活和可维护的代码结构,适用于构建大规模企业级应用。在本文中,我们将探讨Vue3 Composition API的最佳实践方案,帮助开发人员更好…

CentOS大师班:企业级架构与云端融合实战

一、高级存储管理与灾难恢复 1. LVM动态卷扩展实战 pvcreate /dev/sdb1 # 创建物理卷 vgcreate vg_data /dev/sdb1 # 创建卷组 lvcreate -L 100G -n lv_www vg_data # 创建逻辑卷 mkfs.xfs /dev/vg_data/lv_www # 格式化 mount /dev/vg_da…

使用VGG-16模型来对海贼王中的角色进行图像分类

动漫角色识别是计算机视觉的典型应用场景,可用于周边商品分类、动画制作辅助等。 这个案例是一个经典的深度学习应用,用于图像分类任务,它使用了一个自定义的VGG-16模型来对《海贼王》中的七个角色进行分类,演示如何将经典CNN模型…

[创业之路-377]:企业战略管理案例分析-战略制定/设计-市场洞察“五看”:看宏观之社会发展趋势:数字化、智能化、个性化的趋势对初创公司的战略机会

数字化、智能化、个性化趋势为初创公司带来了捕捉长尾需求、提升运营效率、创新商业模式等战略机会,具体分析如下: 一、数字化趋势带来的战略机会 捕捉长尾需求:数字化技术能够帮助初创公司更好地捕捉市场中的长尾需求,满足那些…

macOS 安装 PostgreSQL

文章目录 安装安装信息 验证GUI 工具下载 安装 最简单的方式是通过 brew 安装 brew install postgresql17该版本在 brew 上的详情页:https://formulae.brew.sh/formula/postgresql17 你也可以根据需要,搜索 安装更新版本 如果你没有安装 brew&#xf…