当前位置: 首页 > news >正文

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">/** 知识点&#xff1a;数组* 理解&#xff1a;一维数组的容器* 概念&#xff1a;* 1.数组中的数据叫做元素* 2.元素都有编号叫做下标/索引* 3.下标从0开始* 注意&#xff1a;* 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 <<…...

【微信小程序开发实战项目】——个人中心页面的制作

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…...

基于MCU平台的HMI开发的性能优化与实战(下)

继上篇《基于MCU平台的HMI开发的性能优化与实战&#xff08;上&#xff09;》深入探讨了提升MCU平台HMI开发效率和应用性能的策略后&#xff0c;本文将专注于NXP i.MX RT1170 MCU平台的仪表盘开发实践。我们将重点介绍Qt for MCUs的优化技巧&#xff0c;展示如何通过实际案例应…...

评估测试用例有效性 5个方面

评估测试用例的有效性是确保软件测试活动能够达到预期目标的关键步骤&#xff0c;有助于测试团队优化测试计划&#xff0c;提高测试效率&#xff0c;减少返工&#xff0c;节省成本。如果缺乏对测试用例的有效性评估&#xff0c;可能会导致测试用例无法覆盖关键功能点&#xff0…...

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 为例&#xff0c;如果是其它版本或者系统的话&#…...

Python 编程快速上手——让繁琐工作自动化(第2版)读书笔记01 Python基础快速过关

Python 编程快速上手——让繁琐工作自动化&#xff08;第2版&#xff09;读书笔记01 Python基础快速过关 1 python基础概念 Python提供了高效的高级数据结构&#xff0c;还能简单有效地面向对象编程。 python运算符顺序 **——%——//——/——*——-——python中常见的数据…...

实战 | YOLOv8使用TensorRT加速推理教程(步骤 + 代码)

导 读 本文主要介绍如何使用TensorRT加速YOLOv8模型推理的详细步骤与演示。 YOLOv8推理加速的方法有哪些? YOLOv8模型推理加速可以通过多种技术和方法实现,下面是一些主要的策略: 1. 模型结构优化 网络剪枝:移除模型中不重要的神经元或连接,减少模型复杂度。 模型精…...

绝区陆--大语言模型的幻觉问题是如何推动科学创新

介绍 大型语言模型 (LLM)&#xff08;例如 GPT-4、LLaMA-2、PaLM-2、Claude-2 等&#xff09;已展示出为各种应用生成类似人类文本的出色能力。然而&#xff0c;LLM 的一个鲜为人知的方面是它们倾向于“产生幻觉”或生成不正确或没有根据的事实陈述。我不认为这仅仅是一个限制…...

集训 Day 2 模拟赛总结

复盘 7&#xff1a;30 开题 想到几天前被普及组难度模拟赛支配的恐惧&#xff0c;下意识觉得题目很难 先看 T1&#xff0c;好像不是很难&#xff0c;魔改 Kruskal 应该就行 看 T2 &#xff0c;感觉很神奇&#xff0c;看到多串匹配想到 AC 自动机&#xff0c;又想了想 NOIP …...

Linux系统(CentOS)安装Mysql5.7.x

安装准备&#xff1a; Linux系统(CentOS)添加防火墙、iptables的安装和配置 请访问地址&#xff1a;https://blog.csdn.net/esqabc/article/details/140209894 1&#xff0c;下载mysql安装文件&#xff08;mysql-5.7.44为例&#xff09; 选择Linux通用版本64位&#xff08;L…...

YModem在Android上的实现

&#xff08;一&#xff09;参考文献 【安卓相关】蓝牙基于Ymodem协议发送bin文件&#xff0c;对硬件设备进行升级。 - 简书当Android BLE遇上YModem - 简书 &#xff08;二&#xff09;收发机制 基于我们具体的需求&#xff0c;在原有的基础上加了一下前后的处理。 * MY YMO…...

循环练习题

代码&#xff1a; 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);}} 结果为&#xff1a;...

Seata解决分布式事务

我举的例子是&#xff1a;在网上购物时&#xff0c;我们支付后&#xff0c;订单微服务会更新订单状态&#xff0c;同时会远程调用购物车微服务清空购物车&#xff0c;和调用商品微服务完成商品库存减一。 我们曾经说的事务是只能在本微服务完成回滚&#xff0c;意思就是如果过…...

C语言编译报错error: expected specifier-qualifier-list before

C语言编译报错 error: storage class specified for parameter error: expected specifier-qualifier-list before 原因&#xff1a; 报错信息 "expected specifier-qualifier-list" 通常表示编译器期望在某个地方出现类型指定列表&#xff0c;但却没有找到。这通常…...

无缝协作:如何实现VMware与Ubuntu虚拟机的剪切板共享!

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 剪贴板共享 📒📝 VMware设置📝 安装VMware Tools或open-vm-tools📝 验证剪贴板共享功能⚓️ 相关链接 🚓️📖 介绍 📖 无缝的剪贴板共享是提高工作效率的关键。在VMware和Ubuntu虚拟机的协同工作中,能够直接在宿…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

goreplay

1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具&#xff0c;可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长&#xff0c;测试它所需的工作量也会呈指数级增长。GoRepl…...

RabbitMQ 各类交换机

为什么要用交换机&#xff1f; 交换机用来路由消息。如果直发队列&#xff0c;这个消息就被处理消失了&#xff0c;那别的队列也需要这个消息怎么办&#xff1f;那就要用到交换机 交换机类型 1&#xff0c;fanout&#xff1a;广播 特点 广播所有消息​​&#xff1a;将消息…...

Git 命令全流程总结

以下是从初始化到版本控制、查看记录、撤回操作的 Git 命令全流程总结&#xff0c;按操作场景分类整理&#xff1a; 一、初始化与基础操作 操作命令初始化仓库git init添加所有文件到暂存区git add .提交到本地仓库git commit -m "提交描述"首次提交需配置身份git c…...

uni-app学习笔记二十七--设置底部菜单TabBar的样式

官方文档地址&#xff1a;uni.setTabBarItem(OBJECT) | uni-app官网 uni.setTabBarItem(OBJECT) 动态设置 tabBar 某一项的内容&#xff0c;通常写在项目的App.vue的onLaunch方法中&#xff0c;用于项目启动时立即执行 重要参数&#xff1a; indexnumber是tabBar 的哪一项&…...