Android常用设计模式(小白必看)
不要担心冗长,3分钟解决面试和学习问题,收藏再看
目的:当作一种模板,结合自身特点,针对项目需求来使用
目录
单例模式
特点:
实现方式:
1、饿汉式
2、线程安全的懒汉式
3、双重校验锁
使用经验:
工厂模式
特点:
实现方式:
1、简单工厂模式
2、工厂方法模式
3、抽象工厂模式
编辑
使用经验:
适配器模式
组成:
特点:
实现方式:
编辑
使用经验:
代理模式
特点:
实现方式:
1、静态代理:
2、动态代理
编辑
使用经验:
观察者模式
特点:
实现方式:
编辑
使用经验:
单例模式
特点:
- 整个程序该类 唯一实例化对象
- 统一管理调度
- 避免资源多重占用
- 节省内存开销
- 节省性能开销
实现方式:
1、饿汉式
先初始化好变量,需要时直接返回
//Kotlin
object Singleton//Java
public class Singleton{private Singleton(){}private static Singleton instace = new Singleton();public static Singleton getInstance(){return instance;}
}
2、线程安全的懒汉式
使用同步锁解决懒汉式线程安全问题
//Kotlin
Class Singleton private constructor(){private var instance:Singleton? = nullfun get():Singleton{if (instance == null){synchronized(this){if (instance == null){instance = Singleton()}}}return instance!!}
} //Java
public class Singleton{private Singleton(){}private static Singelton instance;public static sychronized Singleton getInstance(){if(instance==null){instance = new Singleton();}return instance;}
}
3、双重校验锁
考虑线程安全,基于同步锁来创建并返回唯一实例对象
//Kotlin
companion object{val instance:Singleton by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {Singleton()}
}//Java
public class Singleton{private volatile static Singleton instance;private Singleton(){}public static Singleton getInstance(){if(instace == null){synchronized(Singleton.class){if(instance == null){instance = new Singleton();}}}return instance;}
}
4、静态内部类
静态提供单个实例,实例通过内部类创建
//Kotlin
class Singleton private constructor(){companion object{val instance = SingletonHolder.holder}private object SingletonHolder{val holder = Singleton()}
}//Java
public class Singleton{private static class SingletonHolder{private static Singleton instance = new Singleton();}private Singleton(){}public static Singleton getInstance(){return SingletonHolder.instance;}
}
使用经验:
- 线程安全和性能要求高, 使用饿汉式、双重检查锁
- 需要保证创建单例是第一次访问时,使用了懒汉式、静态内部类
工厂模式
特点:
- 不直接实例化对象,通过工厂创建对象
实现方式:
1、简单工厂模式
只创建一个工厂,工厂可以产多个产品(利用接口实现统一)
接口:
interface ICar {fun printColor()fun installEngine()fun installWheels()fun installSystem()fun doit()
}
产品类:
class CarA :ICar {private lateinit var color: Stringprivate lateinit var engine:Stringprivate lateinit var wheels:Stringprivate lateinit var system:Stringoverride fun printColor() {color = "red"println("it is red")}override fun installEngine() {engine = "EngineA"println("it is $engine")}override fun installWheels() {TODO("Not yet implemented")}override fun installSystem() {TODO("Not yet implemented")}override fun doit(){printColor()installEngine()}override fun toString(): String {return "$color+$engine"}
}
工厂类:
class SimpleFactory {companion object{val CAR_A = "CarA"val CAR_B = "CarB"fun buildCar(type:String):ICar?{var car:ICar? = nullwhen(type){CAR_A-> car = CarA()CAR_B-> car = CarB()}car?.doit()return car}}
}
通过工厂创建:
val A = SimpleFactory.buildCar(SimpleFactory.CAR_A)
输出结果:

2、工厂方法模式
多产品类对应多工厂,所有产品类对应一个接口(统一产品大致操作),所有工厂类对应一个接口(统一工厂的大致操作如“生产产品”)
产品接口:
interface ICar {fun printColor()fun installEngine()fun installWheels()fun installSystem()fun doit()
}
工厂接口:
interface IFactory {fun buildCar():ICar
}
工厂类同简单工厂模式一致
新增产品类如CarC,同样实现ICar接口,创建对应工厂C来实现IFactory接口
class CCarFactory:IFactory {private val carC = CarC()override fun buildCar(): ICar {carC.doit()return carC}
}
3、抽象工厂模式
有多个工厂,一个工厂可以生产多种产品(工厂间一个接口统一,同类产品间一个接口统一)
多产品统一接口:


多个工厂,接口统一:
使用经验:
- 第一关注接口,同类产品共有方法放产品接口,工厂要生产哪几类产品的方法放同一工厂接口
- 固定永远只有几种产品。使用简单工厂
- 随时新建工厂,生产新产品。使用工厂方法
- 一个工厂可以生产不同种类产品。使用抽象工厂
适配器模式
不修改现有代码,将不兼容的类组合在一起
组成:
- 目标接口 Target Interface
- 适配器 Adapter :充当两个不兼容接口间的桥梁
- 适配者 Adaptee :需要被适配的对象,该接口与目标接口不兼容
- 客户端 Client :使用目标接口的对象
特点:
- 当需要将一个已有的类或接口与另一个不兼容的类或接口进行协同工作时
- 当需要对一个已有的类或接口进行修改,以满足客户端的需求时,但是不希望修改该类或接口的源代码
- 当需要重新使用一个已有的类或接口,但是不能直接使用该类或接口的方法时
实现方式:
使用经验:
- 由适配器来间接调用适配者方法
- 适配者无需实现目标接口,只需要当作参数或成员变量来传入适配器
- Java IO流,每个数据源都有不同接口,但是Java IO可以将它们转为统一标准接口
- Java Servlet API 定义一组接口处理HTTP请求与相应。每个Servlet都实现这些接口,但是用户只需要实现一部分
代理模式
特点:
- 跨模块调用
- 跨进程调用
- 远程web调用(本地应用与远程web服务)
实现方式:
1、静态代理:
在代理类构造中真实类,最后由调用代理类的同名方法实现真实类的功能

2、动态代理
代理对象不需要接口,利用JDK的API动态构建代理对象
使用经验:
- 当不能直接访问目标对象,可以访问该目标的代理对象
- 目标对象实现的同时,还可以在代理类扩展目标对象的功能(静态代理中)
- 动态代理只有代理类不同,用“ by 目标对象”自动加载代理过程
- 形式参数(小括号里的)不能直接用,必须先用变量接受保存起来,调用变量使用
- 形式参数前加val或var为成员变量,可以在类里直接调用
- 接口可以含参,不可以有方法体
观察者模式
特点:
- 定义对象之间一对多的依赖关系
- 目标发生变化,所有依赖它的对象都会得到通知并自动更新
实现方式:
可以手动添加多个观察者,当观察对象调用某些方法,会通知并更新所有观察者的信息
所有观察者以集合形式存储在对象类里

添加观察者:

通知所有观察者数据更新:
使用经验:
- 事件处理机制:Java中Swing GUI框架基于此实现,当用户与组件交互,组件通知注册的监听器,触发相应事件
- 日志记录:日志变化通知文件输出流,控制台输出流
- 用户界面设计:用户与UI元素交互,它们像注册的监听器发送事件通知,出发相应事件
- 多线程编程:线程发生变化,向其他线程通知,实现线程间协作和同步
相关文章:
Android常用设计模式(小白必看)
不要担心冗长,3分钟解决面试和学习问题,收藏再看 目的:当作一种模板,结合自身特点,针对项目需求来使用 目录 单例模式 特点: 实现方式: 1、饿汉式 2、线程安全的懒汉式 3、双重校验锁 使…...
swift获取app网络和本地网络权限
请求蓝牙权限: //蓝牙if #available(iOS 13.1, *) {let autostate CBManager.authorizationif(autostate .notDetermined){print("")self.manager CBCentralManager(delegate: nil, queue: DispatchQueue.main,options: [CBCentralManagerOptionShowPo…...
用LangGraph、 Ollama,构建个人的 AI Agent
如果你还记得今年的 Google I/O大会,你肯定注意到了他们今年发布的 Astra,一个人工智能体(AI Agent)。事实上,目前最新的 GPT-4o 也是个 AI Agent。 现在各大科技公司正在投入巨额资金来创建人工智能体(AI …...
ubuntu20.04系统编译yolov8-obb.cpp代码记录
任务内容 在做ncnn-yolov8-obb模型安卓端移植的过程中,对开源代码进行调试。为了确认开源代码yolov8-obb.cpp可以移植开发,先对代码进行复现。因此在linux系统下编译yolov8-obb.cpp代码,验证项目中的代码是可运行的。然后再把这个代码中的模…...
JavaScript的数组与函数
数组 <script type"text/javascript">/** 知识点:数组* 理解:一维数组的容器* 概念:* 1.数组中的数据叫做元素* 2.元素都有编号叫做下标/索引* 3.下标从0开始* 注意:* 1.数组作为数据的容器…...
opencv--把cv::Mat数据转为二进制数据的保存和读取
保存 #include <opencv2/opencv.hpp> #include <iostream> #include <fstream>void saveMatToBinary(const cv::Mat& mat, const std::string& filename) {std::ofstream ofs(filename, std::ios::binary);if (!ofs.is_open()) {std::cerr <<…...
【微信小程序开发实战项目】——个人中心页面的制作
👨💻个人主页:开发者-曼亿点 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 曼亿点 原创 👨💻 收录于专栏:…...
基于MCU平台的HMI开发的性能优化与实战(下)
继上篇《基于MCU平台的HMI开发的性能优化与实战(上)》深入探讨了提升MCU平台HMI开发效率和应用性能的策略后,本文将专注于NXP i.MX RT1170 MCU平台的仪表盘开发实践。我们将重点介绍Qt for MCUs的优化技巧,展示如何通过实际案例应…...
评估测试用例有效性 5个方面
评估测试用例的有效性是确保软件测试活动能够达到预期目标的关键步骤,有助于测试团队优化测试计划,提高测试效率,减少返工,节省成本。如果缺乏对测试用例的有效性评估,可能会导致测试用例无法覆盖关键功能点࿰…...
CentOS 7.9 快速更换 阿里云源教程
CentOS 7.9 更换源教程 总结 # 下载 wget yum -y install wget # 备份 yum 源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak # 下载阿里云的yum源到 /etc/yum.repos.d/ # 此处以 CentOS 7 为例,如果是其它版本或者系统的话&#…...
Python 编程快速上手——让繁琐工作自动化(第2版)读书笔记01 Python基础快速过关
Python 编程快速上手——让繁琐工作自动化(第2版)读书笔记01 Python基础快速过关 1 python基础概念 Python提供了高效的高级数据结构,还能简单有效地面向对象编程。 python运算符顺序 **——%——//——/——*——-——python中常见的数据…...
实战 | YOLOv8使用TensorRT加速推理教程(步骤 + 代码)
导 读 本文主要介绍如何使用TensorRT加速YOLOv8模型推理的详细步骤与演示。 YOLOv8推理加速的方法有哪些? YOLOv8模型推理加速可以通过多种技术和方法实现,下面是一些主要的策略: 1. 模型结构优化 网络剪枝:移除模型中不重要的神经元或连接,减少模型复杂度。 模型精…...
绝区陆--大语言模型的幻觉问题是如何推动科学创新
介绍 大型语言模型 (LLM)(例如 GPT-4、LLaMA-2、PaLM-2、Claude-2 等)已展示出为各种应用生成类似人类文本的出色能力。然而,LLM 的一个鲜为人知的方面是它们倾向于“产生幻觉”或生成不正确或没有根据的事实陈述。我不认为这仅仅是一个限制…...
集训 Day 2 模拟赛总结
复盘 7:30 开题 想到几天前被普及组难度模拟赛支配的恐惧,下意识觉得题目很难 先看 T1,好像不是很难,魔改 Kruskal 应该就行 看 T2 ,感觉很神奇,看到多串匹配想到 AC 自动机,又想了想 NOIP …...
Linux系统(CentOS)安装Mysql5.7.x
安装准备: Linux系统(CentOS)添加防火墙、iptables的安装和配置 请访问地址:https://blog.csdn.net/esqabc/article/details/140209894 1,下载mysql安装文件(mysql-5.7.44为例) 选择Linux通用版本64位(L…...
YModem在Android上的实现
(一)参考文献 【安卓相关】蓝牙基于Ymodem协议发送bin文件,对硬件设备进行升级。 - 简书当Android BLE遇上YModem - 简书 (二)收发机制 基于我们具体的需求,在原有的基础上加了一下前后的处理。 * MY YMO…...
循环练习题
代码: public static void main(String[] args) { for (char c1a;c1<z;c1){System.out.print(" "c1); }System.out.println();for (char c2Z;c2>A;c2--){System.out.print(" "c2);}} 结果为:...
Seata解决分布式事务
我举的例子是:在网上购物时,我们支付后,订单微服务会更新订单状态,同时会远程调用购物车微服务清空购物车,和调用商品微服务完成商品库存减一。 我们曾经说的事务是只能在本微服务完成回滚,意思就是如果过…...
C语言编译报错error: expected specifier-qualifier-list before
C语言编译报错 error: storage class specified for parameter error: expected specifier-qualifier-list before 原因: 报错信息 "expected specifier-qualifier-list" 通常表示编译器期望在某个地方出现类型指定列表,但却没有找到。这通常…...
无缝协作:如何实现VMware与Ubuntu虚拟机的剪切板共享!
文章目录 📖 介绍 📖🏡 演示环境 🏡📒 剪贴板共享 📒📝 VMware设置📝 安装VMware Tools或open-vm-tools📝 验证剪贴板共享功能⚓️ 相关链接 🚓️📖 介绍 📖 无缝的剪贴板共享是提高工作效率的关键。在VMware和Ubuntu虚拟机的协同工作中,能够直接在宿…...
OpenClaw对接nanobot镜像:低成本实现本地AI助手自动化任务
OpenClaw对接nanobot镜像:低成本实现本地AI助手自动化任务 1. 为什么选择OpenClawnanobot组合 去年夏天,当我第一次尝试用AI自动化处理日常工作时,发现大多数方案要么需要昂贵的云服务API调用,要么对硬件要求极高。直到遇到Open…...
彻底解决电脑噪音烦恼:FanControl风扇控制软件完全指南
彻底解决电脑噪音烦恼:FanControl风扇控制软件完全指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…...
合宙 MCP 工具:TRAE AI 自然语言控制 Luatools 实操
合宙MCP工具基于 MCP 协议,实现 AI 大模型与 Luatools 的无缝连接,开发者通过简单 JSON 配置,就能在 TRAE 编辑器用自然语言操控 Luatools 完成固件下载、日志获取等操作,告别手动烧录的繁琐。 核心能力: 固件自动烧录…...
MybatisPlus分页插件PaginationInnerInterceptor原理解析与实战配置指南
MybatisPlus分页插件PaginationInnerInterceptor深度剖析与高效实践 当你在Spring Boot项目中处理海量数据时,分页查询就像给数据装上精准导航——而MybatisPlus的PaginationInnerInterceptor正是这个导航系统的核心引擎。不同于简单配置就能用的工具类,…...
Windows下BERTopic安装避坑指南:解决hdbscan报错(附Python 3.8环境配置)
Windows下BERTopic安装避坑指南:解决hdbscan报错(附Python 3.8环境配置) 第一次在Windows上安装BERTopic时,那个红色的hdbscan报错信息让我盯着屏幕发了十分钟呆。作为一款强大的主题建模工具,BERTopic的安装本不该如此…...
【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(五)- 动态配置与性能优化实战(vsetvli/vsetivli/vsetvl)
1. 动态向量配置指令的核心作用 RISC-V向量扩展指令集中最精妙的设计之一,就是允许程序运行时动态调整向量处理参数的机制。想象你正在用不同尺寸的螺丝刀组装家具——当遇到大螺丝就换大号刀头,碰到小螺丝立即切换精密刀头,这就是vsetvli/vs…...
告别低效收藏:MarkDownload让网页内容保存效率提升300%
告别低效收藏:MarkDownload让网页内容保存效率提升300% 【免费下载链接】markdownload A Firefox and Google Chrome extension to clip websites and download them into a readable markdown file. 项目地址: https://gitcode.com/gh_mirrors/ma/markdownload …...
【GitHub 加速计划】:解决智能家居插件获取难题的网络适配方案
【GitHub 加速计划】:解决智能家居插件获取难题的网络适配方案 【免费下载链接】integration 项目地址: https://gitcode.com/gh_mirrors/int/integration 在智能家居系统搭建过程中,插件获取往往是用户面临的首要障碍。许多优质的智能家居插件托…...
MarkDownload:让网页转Markdown变得简单高效的浏览器扩展
MarkDownload:让网页转Markdown变得简单高效的浏览器扩展 【免费下载链接】markdownload A Firefox and Google Chrome extension to clip websites and download them into a readable markdown file. 项目地址: https://gitcode.com/gh_mirrors/ma/markdownload…...
Qwen3.5-4B-Claude-Opus部署教程:模型路径软链失效时的容错加载机制
Qwen3.5-4B-Claude-Opus部署教程:模型路径软链失效时的容错加载机制 1. 模型概述 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是基于Qwen3.5-4B的推理蒸馏模型,特别强化了结构化分析、分步骤回答以及代码与逻辑类问题的处理能力。该版本以GG…...



