位置: 编程技术 - 正文

Android中的设计模式-单例模式(android设计模式总结)

编辑:rootadmin
Android中的设计模式-单例模式

推荐整理分享Android中的设计模式-单例模式(android设计模式总结),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android设计模式总结,android设计模式有哪些,android 设计,android设计原则,android 设计,android设计模式总结,android设计原则,android中的设计模式,内容如对您有帮助,希望把文章链接给更多的朋友!

单例模式算是比较常用的模式,在Java中如果想要一个JVM中只存在某个类的一个实例,就需要使用到单例模式,而只存在一个实例的需求一般是因为: 1,对象实例比较大和复杂,创建开销很大。 2,只需要一个实例来维护整个功能的流程与交互。 例如Android中的电话应用启动时,对于单卡单待的电话,只创建一个Phone对象,用来管理RIL,CallTracker,ServiceStateTracker等对象,手机中不存在第二个Phone对象去和RILC通信。

类图

单例的类图很简单,看起来也很简单,只需要一个类只能得到一个实例即可,但是我觉得单例比其他创建型的模式要复杂的多。 如果想要创建一个类Singleton。正常来讲只需要new Singleton()即可,但是如果想Singleton只存在一个实例,则不能采用这种方法来创建,因为每一次new都会产生一个新的实例: 1,为了不能使用new创建,就要把构造函数变成private的; 2, 为了只有一个实例,就需要Singleton本身去维护这个实例,于是类中需要定义一个Singleton instance,显然它应该是private的,因为它是类的实例,不是对象的实例,所以它还应该是静态的; 3,因为不能new,为了能够有方法得到Singleton的实例,就得通过一个静态方法返回实例,比如public static Singleton getInstance(),在内部如果instance是null的则新建,否则返回instance即可,

说了这么多其实需要注意的东西还是蛮多的,根据上面的分析,已经能够创建出一个最简单单例模式了。

普通饿汉单例模式

饿汉单例会在类装载时就实例化。好处就是由于classloder机制,保证当一个类被加载的时候,这个类的加载是线程互斥的,而饿汉单例的静态instance直接新建一个实例,在加载的时候就能线程安全的获得实例。从而避免了线程安全问题。 劣势就是实例在装载的时候就会浪费资源和时间去实例化。虽然大多数时候都是在调用getInstance时才会装载,不过也没法保证是否有其他方法会使用到instance而导致新建实例。

惰性加载单例模式

这个Singleton单例类在被加载的时候就会创建实例,为了让它在使用的时候才创建对象所以把它设为null。让它在getInstace的时候再新建实例,也就是惰性加载。这里也叫懒汉式单例。

加锁单例模式Android中的设计模式-单例模式(android设计模式总结)

前面的懒汉例子用在单线程中不会出现问题,但是如果用在单线程中就会出现问题。如果AB两个线程都通过getInstace去获取单例的实例,因为没法保证getInstace方法会在一个线程中一直执行完再执行另一个线程,如果两个线程都判定instance位null,则有可能都会进入new语句新建实例。 为了保证同一时刻只有一个线程能够执行getInstance,就需要对方法加锁,或者在方法内部使用对象锁,但是注意要把锁放在if(instance == null) 判断的外面,否则还是可能出现同时判定true的情况。

或者

双重检查加锁单例

上面的问题解决了多线程的问题,但是也会带来性能的问题,因为每次调用getInstance,都会进行同步,但实际上,如果instance实例已经建立,那直接返回instance实例就好,这里是不用加锁的,只有新建实例的情况才需要同步锁,但是前面也说到了,新建的时候要把锁放在if(instance == null) 判断的外面,否则还是可能出现同时判定true的情况。所以就有了下面的双重检查的单例模式

这样当实例初始化已经完成的情况,每次getInstance直接返回即可,不再需要同步锁。 当第一次调用getInstance时,则通过synchronized块包裹的代码部分保证不会多次调用新建实例。 第二个if (instance == null) 条件判断是为了第一个if (instance == null) 是给已经存在实例的情况用的,AB线程还是有可能都通过第一个条件判断的。这就需要在同步块内,一定要有一个条件判断。

双重检查加锁单例模式很好地解决了加锁单例的性能问题。

使用静态内部类的单例模式

静态内部类也叫嵌套类,用这个名字给他定义是更加形象的。意思是说内部类和外部类的关系只是层次嵌套关系,所以只是在创建类文件的时候类文件名是如下形式:outer$inner.java,在使用方面完全和两个普通类一样。 在饿汉单例的基础上,把instance = new Singleton()外用一个叫做SingletonHolder 的静态内部类包装一下。 这样即使在Singleton类加载的时候,也不会导致静态内部类SingletonHolder 的加载,只有在使用到SingletonHolder 的时候,才会加载。 同时由于类的加载的机制的互斥性,保证创建实例时候的线程安全性。

Android中的单例

通过PhoneFactory创建Phone对象的例子,截取部分如下:

可以看出这个例子符合上面的加锁单例模式,虽然不是采用的双重判断的方式来增加效率,但是因为PhoneFactory的makeDefaultPhone基本没有多线程使用情况,只有在Phone应用启动的情况下调用一起。 并且PhoneFactory通过makeDefaultPhone来创建实例,但是却使用getDefaultPhone来获取实例,也就不存在实例已经存在的情况下,还进入同步块进行判断的情况。

Java中的锁 原文链接作者:JakobJenkov译者:申章校对:丁一java中的锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂。因为锁(

Android笔记三十二.Android位置服务及核心API 一、位置服务概念1.位置服务位置服务(Location-BasedServices,LBS),又称定位服务或基于位置的服务,融合了GPS定位、移动通信、导航等多种技术,提供了与个

【JNI】开发流程6步骤 JNI开发流程主要分为以下6步:1、编写声明了native方法的Java类2、将Java源代码编译成class字节码文件3、用javah-jni命令生成.h头文件(javah是jdk自带的一个

标签: android设计模式总结

本文链接地址:https://www.jiuchutong.com/biancheng/378196.html 转载请保留说明!

上一篇:android 在android中教你一行代码判断是不是主线程(“android”)

下一篇:Java中的锁(java中的锁机制)

  • 单位的车辆车船税怎么交
  • 提存计划和受益计划选那个
  • 劳动合同和劳务合同有什么区别 举例
  • 无销项税额
  • 强制解除财务负责人
  • 资产负债表中其他流动资产包括哪些科目
  • 现金支票填写注意事项有哪些
  • 安全费用中的固定资产如何写会计分录?
  • 建筑业收入确认条件
  • 跨年度的银行未入账如何处理
  • 应付职工薪酬包括个税吗
  • 合伙企业可以弥补以前年度亏损吗
  • 合作开发项目收益怎么算
  • 物业公司取暖费收费标准
  • 创业投资公司设立条件
  • 最新消费税税目顺口溜
  • 填写报关单需要什么资料
  • 应付职工薪酬明细表怎么填写
  • 如何查询发票是否验旧
  • 长期股权投资减值的判断依据
  • 关联公司代付款
  • 进项税额转出月底如何结转
  • iphone制造成本
  • 公司名下汽车过户给个人
  • mac桌面的文件夹怎么换到别的地方
  • u盘装机大师怎么用
  • 在windows7操作具有
  • 采购涉及哪些部门
  • sgmain.exe - sgmain是什么进程 有何作用
  • PHP:highlight_string()的用法_misc函数
  • 酒店损益类科目包括哪些
  • php 序列化函数
  • php实现数据库创建题库
  • AttributeError: ‘bytes‘ object has no attribute ‘encode‘异常解决方案
  • 应收借方表示什么
  • php数组排列组合
  • 销售机构人员工作总结
  • 广告费可以结转几年扣除
  • 【Netty系列・高级篇】Netty核心源码解析
  • 海关缴款书稽核比对
  • 企业商品库存周期是多久
  • 外贸出口企业的税务风险
  • 一般纳税人销售旧货适用征收率是?
  • 税控服务费减免会计分录
  • 小微企业买商品房怎么买
  • 个体工商户未年报 经营异常罚款
  • 跨月凭证怎么冲销
  • 小微企业开专票需要缴纳多少税
  • 进项税转出金额怎么算
  • 什么叫做增值税的新增价值呢
  • 应付职工薪酬的工资是实发工资还是应发工资
  • 分期收款销售商品,收到本期贷款50万元
  • 主营业务收入计入借方还是贷方
  • 购入钢材
  • 餐饮发票食品发票
  • 收到固定资产发票怎么入账
  • 什么是交易价格指数
  • 商业企业成本核算方法有哪些
  • bulk insert formatfile
  • 深度Win7 64位系统默认输入法图标如何个性化设置
  • ubuntu笔记软件
  • win7隐藏账户
  • 在windows xp的应用程序中,经常有一些
  • win8 资源管理器
  • win10系统中打开任务管理器的快捷键
  • ghost详细说明
  • unity3d初学者教程视频
  • web中class和id的区别
  • iframe内容自适应缩放
  • jquery删除dom
  • socket怎么用
  • js自定义鼠标右键菜单
  • 安卓暗屏
  • html键盘监听
  • JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
  • 国家税务局浙江省电子税务局新版
  • 支付宝登录电子社保卡显示已被其他账号登录
  • 广西税务移动办税平台app
  • 如果企业所得税没有做计提怎么办?
  • 许昌祥和小区二手房出售
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设