写一个 Android 版本的抽象工厂弹窗 + Manager 管理器,使用 DialogFragment 实现,这样能更贴近真实的开发场景。


结构设计

  1. 抽象产品BaseDialogFragment(继承 DialogFragment
  2. 具体产品LoginDialogFragment, UpdateDialogFragment
  3. 抽象工厂DialogFactory
  4. 具体工厂LoginDialogFactory, UpdateDialogFactory
  5. 弹窗管理器DialogManager(统一展示 / 关闭弹窗)

代码实现

抽象产品

import android.app.Dialog;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.DialogFragment;public abstract class BaseDialogFragment extends DialogFragment {@NonNull@Overridepublic abstract Dialog onCreateDialog(@Nullable Bundle savedInstanceState);public void dismissDialog() {if (getDialog() != null && getDialog().isShowing()) {dismiss();}}
}

具体产品

import android.app.AlertDialog;
import android.app.Dialog;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;public class LoginDialogFragment extends BaseDialogFragment {@NonNull@Overridepublic Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {return new AlertDialog.Builder(requireContext()).setTitle("登录").setMessage("请输入账号密码").setPositiveButton("确定", (dialog, which) -> {// 登录逻辑}).setNegativeButton("取消", null).create();}
}
import android.app.AlertDialog;
import android.app.Dialog;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;public class UpdateDialogFragment extends BaseDialogFragment {@NonNull@Overridepublic Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {return new AlertDialog.Builder(requireContext()).setTitle("更新提示").setMessage("检测到新版本,是否更新?").setPositiveButton("更新", (dialog, which) -> {// 更新逻辑}).setNegativeButton("稍后", null).create();}
}

抽象工厂

public interface DialogFactory {BaseDialogFragment createDialog();
}

具体工厂

public class LoginDialogFactory implements DialogFactory {@Overridepublic BaseDialogFragment createDialog() {return new LoginDialogFragment();}
}
public class UpdateDialogFactory implements DialogFactory {@Overridepublic BaseDialogFragment createDialog() {return new UpdateDialogFragment();}
}

弹窗管理器

import androidx.fragment.app.FragmentManager;
import java.util.HashMap;
import java.util.Map;public class DialogManager {private static final Map<String, BaseDialogFragment> dialogCache = new HashMap<>();public static void showDialog(String key, DialogFactory factory, FragmentManager fragmentManager) {if (!dialogCache.containsKey(key)) {dialogCache.put(key, factory.createDialog());}BaseDialogFragment dialog = dialogCache.get(key);if (dialog != null && !dialog.isAdded()) {dialog.show(fragmentManager, key);}}public static void dismissDialog(String key) {BaseDialogFragment dialog = dialogCache.get(key);if (dialog != null) {dialog.dismissDialog();dialogCache.remove(key);}}
}

使用示例 (Activity 中调用)

public class MainActivity extends AppCompatActivity {@Overrideprotected void onResume() {super.onResume();// 显示登录弹窗DialogManager.showDialog("login", new LoginDialogFactory(), getSupportFragmentManager());// 显示更新弹窗DialogManager.showDialog("update", new UpdateDialogFactory(), getSupportFragmentManager());// 关闭登录弹窗DialogManager.dismissDialog("login");}
}

✅ 优点:

  • 扩展性强:新增一个弹窗,只需要新增 DialogFragment + FactoryDialogManager 无需改动
  • 全局管理:可以统一控制弹窗的缓存、复用、显示/关闭逻辑
  • 线程安全:使用 FragmentManager 管理生命周期,避免内存泄漏

再加一个 全局策略(比如保证同一时间只显示一个弹窗,后来的会自动关闭之前的)

DialogManager 里加一个 全局策略:同一时间只允许显示一个弹窗。这样新的弹窗显示时,会自动关闭之前的。


改造后的 DialogManager

import androidx.fragment.app.FragmentManager;
import java.util.HashMap;
import java.util.Map;public class DialogManager {private static final Map<String, BaseDialogFragment> dialogCache = new HashMap<>();private static String currentDialogKey = null; // 当前正在显示的弹窗 keypublic static void showDialog(String key, DialogFactory factory, FragmentManager fragmentManager) {// 如果有正在显示的弹窗,先关闭if (currentDialogKey != null && dialogCache.containsKey(currentDialogKey)) {dismissDialog(currentDialogKey);}// 创建或获取弹窗if (!dialogCache.containsKey(key)) {dialogCache.put(key, factory.createDialog());}BaseDialogFragment dialog = dialogCache.get(key);// 显示弹窗if (dialog != null && !dialog.isAdded()) {dialog.show(fragmentManager, key);currentDialogKey = key;}}public static void dismissDialog(String key) {BaseDialogFragment dialog = dialogCache.get(key);if (dialog != null) {dialog.dismissDialog();dialogCache.remove(key);if (key.equals(currentDialogKey)) {currentDialogKey = null;}}}public static void dismissCurrentDialog() {if (currentDialogKey != null) {dismissDialog(currentDialogKey);}}public static boolean isDialogShowing() {return currentDialogKey != null;}
}

使用示例

public class MainActivity extends AppCompatActivity {@Overrideprotected void onResume() {super.onResume();// 显示登录弹窗DialogManager.showDialog("login", new LoginDialogFactory(), getSupportFragmentManager());// 这里再显示更新弹窗时,会自动关闭上一个(login)DialogManager.showDialog("update", new UpdateDialogFactory(), getSupportFragmentManager());// 关闭当前正在显示的弹窗(update)DialogManager.dismissCurrentDialog();}
}

✅ 这样就具备了:

  1. 抽象工厂扩展性:新增弹窗不用改管理器。
  2. 缓存 & 复用:避免重复创建相同弹窗。
  3. 全局策略:同一时间只显示一个弹窗。
  4. 可选扩展:还能加优先级队列(比如:强制更新弹窗 > 登录弹窗 > 普通提示弹窗)。

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

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

相关文章

Win64OpenSSL-3_5_2.exe【安装步骤】

官网下载 注意&#xff1a;科学上网&#xff0c;可以加速下载速度&#xff01; Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 下载后得到&#xff1a;Win64OpenSSL-3_5_2.exe 双击安装 修改安装路径&#xff1a; 默认就选择第一个。 重要提醒​…

华为云云原生架构赋能:大腾智能加速业务创新步伐

巨大的涡轮、细小的螺丝&#xff0c;一台航天飞机发动机的三维模型呈现在屏幕上&#xff0c;远程同事同步协作&#xff0c;一台复杂设备在工程师高效的协同中不断完善。深圳市大腾信息技术有限公司&#xff0c;正是这场工业变革的推动者之一。大腾智能以“云原生工业”的融合为…

基于https+域名的Frp内网穿透教程(Linux+Nginx反向代理)

系列文章目录 基于http公网ip的Frp内网穿透教程(win server) 基于http域名的Frp内网穿透教程(win serverIIS反向代理) 基于http公网ip的Frp内网穿透教程(Linux) 基于https域名的Frp内网穿透教程(LinuxNginx反向代理) 目录 系列文章目录 前言 一、Frp是什么&#xff1f; 1. …

裸机程序(1)

一、裸机裸机是一个在计算机硬件与软件开发领域高频出现的概念&#xff0c;核心定义是 “未安装操作系统&#xff08;OS&#xff09;&#xff0c;仅包含硬件本身&#xff08;或仅运行最底层硬件驱动 / 控制程序&#xff09;的设备”。在电脑中&#xff0c;裸机会映射代码到cpu&…

95%企业AI失败?揭秘LangGraph+OceanBase融合数据层如何破局!​

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。不知道你们有没有遇到过&#xff0c;在我们一些实际落地的AI项目中&#xff0c;虽然前期“Demo 很惊艳&#xff0c;但上线后却无人问津”。你们有没有想…

树莓集团产教融合:数字学院践行职业教育“实体化运营”要求

在职业教育改革不断深化的背景下&#xff0c;“实体化运营” 成为推动职业教育高质量发展的重要方向。树莓集团积极响应这一要求&#xff0c;以产教融合为核心&#xff0c;打造数字学院&#xff0c;切实践行职业教育 “实体化运营”&#xff0c;为培养高素质数字领域专业人才探…

ELK 统一日志分析系统部署与实践指南(上)

#作者&#xff1a;张桐瑞 文章目录1 ELK 技术栈概述1.1ELK 核心组件详解1.2 ELK 工作流程2 ELK部署2.1 环境描述2.1.7 配置es集群下篇&#xff1a;《ELK 统一日志分析系统部署与实践指南&#xff08;下&#xff09;》 链接: [https://blog.csdn.net/qq_40477248/article/detail…

上位机知识篇---poweshellcmd

要理解 PowerShell 和 CMD 的区别&#xff0c;我们可以先打个通俗的比方&#xff1a;CMD 像老式功能机&#xff0c;只能干打电话、发短信这些 “基础活”&#xff1b;而 PowerShell 像智能手机&#xff0c;不仅能做基础操作&#xff0c;还能装 APP、玩复杂功能&#xff0c;甚至…

利用 Python 绘制环形热力图

暑假伊始&#xff0c;Coldrain 参加了学校举办的数模集训&#xff0c;集训的过程中&#xff0c;遇到了需要展示 59 个特征与 15 个指标之间的相关性的情况&#xff0c;在常用的图表不大合适的情况下&#xff0c;学到了一些厉害的图表&#xff0c;但是似乎千篇一律都是用 R 语言…

【序列晋升】27 Spring Cloud Sleuth给分布式系统装上透视镜

Spring Cloud Sleuth作为微服务架构中的核心监控组件&#xff0c;通过轻量级的无侵入式跟踪机制&#xff0c;解决了分布式系统中请求路径复杂、问题定位困难的痛点。它自动为每个服务请求创建唯一的Trace ID&#xff0c;并为每个服务间调用生成Span ID&#xff0c;形成完整的调…

Linux(2)|入门的开始:Linux基本指令(2)

一、基本指令介绍 回顾上篇博客Linux(1)|入门的开始&#xff1a;Linux基本指令-CSDN博客&#xff0c;我们已经学习了mkdir目录的创建&#xff0c;touch普通文件的创建&#xff0c;光有创建肯定是不行的&#xff0c;接下来就介绍我们的删除指令 1、rmdir指令&&rm指令 …

sv中forever如何结束

在 SystemVerilog 中&#xff0c;forever 循环本身无法自我结束。它的设计初衷就是创建一个永不终止的循环。 因此&#xff0c;要结束一个 forever 循环&#xff0c;必须从外部强制中断它。主要有以下两种方法&#xff1a;1. 使用 disable 语句&#xff08;最常用和推荐的方法&…

关于熵减 - 从法拉第圆盘到SEG

我们清楚的知道法拉第圆盘发电机的原理。当导线切割磁感线的时候&#xff0c;会产生电流&#xff0c;当然电流产生需要的是电动势&#xff0c;也就是&#xff0c;这里写 不写 &#xff0c;避免和电场强度混淆。根据上面的分析&#xff0c;我们知道磁场强度特斯拉 的单位&#x…

【机器学习】实战:市场增长点分析挖掘项目

在电商行业激烈竞争的背景下&#xff0c;精准挖掘市场增长点是企业保持竞争力的关键。本文基于拜耳官方旗舰店驱虫剂市场分析项目&#xff0c;先对原文核心内容进行梳理与解读&#xff0c;再续写关键的竞争分析模块&#xff0c;形成完整的市场增长点挖掘闭环&#xff0c;为企业…

【Day 18】21.合并两个有序链表 2.两数相加

文章目录21.合并两个有序链表题目&#xff1a;思路&#xff1a;迭代代码实现&#xff08;Go&#xff09;&#xff1a;2.两数相加题目&#xff1a;思路&#xff1a;代码实现&#xff08;Go&#xff09;&#xff1a;21.合并两个有序链表 题目&#xff1a; 将两个升序链表合并为…

Vue 3 WebSocket通信方案:从原理到实践

Vue 3 WebSocket通信方案&#xff1a;从原理到实践 在现代Web应用开发中&#xff0c;实时通信已成为许多应用的核心需求。从即时聊天到实时数据更新&#xff0c;用户对应用响应速度的期望越来越高。本文将深入剖析一个Vue 3环境下的WebSocket通信方案&#xff0c;包括基础封装与…

Windows 电源管理和 Shutdown 命令详解

一、Windows 电源管理概述 Windows 操作系统通过其内置的电源管理框架&#xff0c;为用户提供了多种电源状态和配置选项&#xff0c;以在性能、能耗和数据安全之间找到最佳平衡点。以下是 Windows 系统中常见的电源状态及其特点&#xff1a; 1. 睡眠&#xff08;Sleep&#xff…

Selenium WebUI 自动化“避坑”指南——从常用 API 到 10 大高频问题

目录 一、为什么 90% 的 UI 自动化脚本活不过 3 个月&#xff1f; 二、Selenium必会 API 速查 三、实践 四、10 大高频异常“症状 → 病因 → 处方” 五、可复用的工具函数 六、面试高频追问&#xff08;附标准答案&#xff09; 一、为什么 90% 的 UI 自动化脚本活不过 …

【微信小程序】微信小程序基于双token的API请求封装与无感刷新实现方案

文章目录前言一、设计思路二、执行流程三、核心模块3.1 全局配置3.2 request封装3.2.1 request方法配置参数3.2.2 请求预处理3.2.3 核心请求流程3.3 刷新accessToken3.4 辅助方法四、api封装示例总结前言 现代前后端分离的模式中&#xff0c;一般都是采用token的方式实现API的…

基于单片机醉酒驾驶检测系统/酒精检测/防疲劳驾驶设计

传送门 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目速选一览表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品题目功能速览 概述 该设计基于单片机开发&#xff0c;旨在通过实时检测驾驶员酒精浓度&#xff0c;预防酒后驾驶行为…