当前位置: 首页 > 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虚拟机的协同工作中,能够直接在宿…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...