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? = null
  fun 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: String
    private lateinit var engine:String
    private lateinit var wheels:String
    private lateinit var system:String


    override 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? = null
            when(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元素交互,它们像注册的监听器发送事件通知,出发相应事件
  • 多线程编程:线程发生变化,向其他线程通知,实现线程间协作和同步

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

内网渗透第7天 socker代理 会不会???我们使用cs以及msf来建立代理 代理真的容易???步骤弄明白了吗??

我们在进行内网渗透的时候,第一步要解决的就是网的问题,网络我们都不通或者我们都不能进行访问怎么能进行后门的渗透。我们今天就来讲讲怎么进行建立代理的。这的图非常的简单,也没有waf等阻碍,我们的目的就是攻击机器可以对web进…

RockYou2024 发布史上最大密码凭证

参与 CTF 的每个人都至少使用过一次臭名昭著的rockyou.txt单词表,主要是为了执行密码破解活动。 该文件是一份包含1400 万个唯一密码的列表。 源自 2009 年的 RockYou 黑客攻击,创造了计算机安全历史。 多年来,“rockyou 系列”不断发展。…

ASP.NET MVC Lock锁的测试

思路:我们让后台Thread.Sleep一段时间,来模拟一个耗时操作,而这个时间可以由前台提供。 我们开启两个或以上的页面,第一个耗时5秒(提交5000),第二个耗时1秒(提交1000)。 期望的测试结果: 不加Lock锁&…

如何在Facebook上保护你的个人资料安全?

随着社交媒体的普及和个人信息的数字化,保护个人资料安全成为越来越重要的议题。特别是在使用像Facebook这样的平台时,我们需要特别注意如何保护我们的数据免受未经授权的访问和滥用。本文将探讨一些实用的方法,以及如何增强你在Facebook上的…

10359-002J 同轴连接器

型号简介 10359-002J是Southwest Microwave的2.92 mm连接器。该连接器外壳材料是不锈钢 CRES 合金 UNS-30300,接触材料是 Becu UNS-C17300,接触镀层是金 MIL-DTL-45204,捕捉材料是 ULTEM 1000。 型号特点 电缆螺母:不锈钢&#x…

RightFont 8.7.0 Mac专业字体管理工具

RightFont 适用于 macOS 的终极字体管理器应用程序,提供无缝的字体管理体验。它结合了速度、直观的功能和专业的功能,使用户能够轻松预览、安装、组织和共享字体。 RightFont 8.7.0 Mac下载 RightFont 8.0的新增功能 RightFont 8.0 带来了全新的智能选…

安防视频监控/云存储/视频汇聚EasyCVR平台播放设备录像不稳定,是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,EasyCVR基于云边端一体化架构,具有强大的数据接入、处理及分发能力,可提供7*24小时实时高清视频监控、云端录像、云存储、录像检索与回看、智能告警…

初创企业:如何执行OKR周期?

对于早期创业公司,Tita的OKR教练关于执行OKR周期推荐不是“季度年度”,而是一下三个执行周期: 一个月:”这个月我们在做什么 “是关键问题 团队负责人在月末前的周一上午聚在一起,记录下一个月的功能发布。这是一个自…

Games101——光珊化——深度缓存——shading着色 1

深度缓存 如何解决远近的问题,能正确的覆盖 按照画作来说,先画出远处的物体,再画出近处的物体,近处会将其覆盖,这种算法叫做画家算法 但事实上,排序不仅要花更多的时间,而且排序并不容易&…

使用webrtc-streamer查看rtsp实时视频

1.下载webrtc-streamer 2.解压运行webrtc-streamer.exe 在浏览器访问127.0.0.1:8000,点击窗口可以看到本机上各窗口实时状态,点击摄像头可以显示摄像头画面。 5.安装phpstudy,并建立网站。(具体过程自己网上搜) 6.打开…

手把手带你本地部署大模型

这篇文章的唯一目的是实现在本地运行大模型,我们使用LMStudio这个工具协助达成这个目标。 文章目录 一,下载安装LM Studio二,本地部署大模型1,搜索模型2,下载大模型3,加载大模型4,测试大模型5&a…

Java实战:寻找完美数

文章目录 一、何谓完美数二、寻找完美数(一)编程思路(二)编写程序(三)运行程序 三、实战小结 一、何谓完美数 完美数是一种特殊的自然数,它等于其所有正除数(不包括其本身&#xff…

算法——同步算法

在力扣有这样一道题求交集,与此类似的还有求差集,相关的解法有很多。我这里提供一种思路:利用C的容器set对这两个数组去重,遍历数组插入set即可去重。再同时遍历比较set的每个元素。 代码实现很简单,如下所示&#xff…

《mysql篇》--索引事务

索引 索引的介绍 索引是帮助MySQL高效获取数据的数据结构,是一种特殊的文件,包含着对数据表里所有记录的引用指针,因为索引本身也比较大,所以索引一般是存储在磁盘上的,索引的种类有很多,不过如果没有特殊…

人工智能AI安全认证,我推荐CAISP认证!

在人工智能AI越来越火热的时代,AI信息安全认证已经成为热门职业,是众多知名企业众星捧月的人才! 成为高级AI安全专业官,认准CAISP人工智能安全专家认证! 课程概述: 生成式人工智能、大模型等人工智能技术…

VBA实现Excel的数据透视表

前言 本节会介绍通过VBA的PivotCaches.Create方法实现Excel创建新的数据透视表、修改原有的数据透视表的数据源以及刷新数据透视表内容。 本节测试内容以下表信息为例 1、创建数据透视表 语法:PivotCaches.Create(SourceType, [SourceData], [Version]) 说明&am…

文章SameStr(三):图3代码

“Publication Figure 3” 百度云盘链接: https://pan.baidu.com/s/15g7caZp354zIWktpnWzWhQ 提取码: 4sh7 Libraries Standard Import library(tidyverse) library(cowplot) library(scales) library(ggpubr)Special library(ggridges) library(grid) # library(Hmisc) …

国产鸿道Intewel操作系统与Codesys高实时虚拟化运动控制解决方案

随着运控行业的快速发展,实时与非实时业务的融合应用需求日益增长。例如在机器视觉处理领域,无论是在Windows还是Linux平台上,传统实时操作系统无法与非实时操作系统如Windows或Linux兼容,不能充分利用Windows或者Linux系统的生态…

CC7利用链分析

分析版本 Commons Collections 3.2.1 JDK 8u65 环境配置参考JAVA安全初探(三):CC1链全分析 分析过程 CC7,6,5都是在CC1 LazyMap利用链(引用)的基础上。 只是进入到LazyMap链的入口链不同。 CC7这个链有点绕,下面顺着分析一下利用链。 入口类是Hashtable&…

Java面试八股之MySQL索引B+树、全文索引、哈希索引

MySQL索引B树、全文索引、哈希索引 注意:B树中B不是代表二叉树(binary),而是代表平衡(balance),因为B树是从最早的平衡二叉树演化而来,但是B树不是一个二叉树。 B树的高度一般在2~…