Android中的单例模式
定义:
单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
使用场景:
确保某一个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象只应该有且只有一个。
UML类图:

单例模式几个关键点:
1、构造函数不对外开放,一般为private。
2、通过一个静态方法或者枚举返回单例类对象。
3、确保单例类的对象有且只有一个,尤其在多线程环境下。
4、确保单例类对象在反序列化时不会重新构建对象。
单例模式简单代码:
public class Singleton{
static Singleton instance=null;
private void Singleton(){}
public static Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
单例模式其他方式:
1、懒汉模式:声明一个静态对象,并且在用户第一次调用getInstance时进行初始化,在getInstance()方法中添加了synchronized关键字,实现该方法的同步管理,特别是在多线程情况下,防止重复初始化。
该模式优点:单例只有在使用时才被实例化,节省资源;缺点:第一次加载实例化,反应慢,最大问题是每次调用getInstance()方法都需要同步,造成不必要的同步开销。
public class Singleton{
static Singleton instance=null;
private void Singleton(){}
public static synchronized Singleton getInstance(){
if(instance==null){
instance=new Singleton();
}
return instance;
}
}
2、Double Check Lock(DCL双重检查锁定)
DCL方式实现单例模式优点是,既能够在需要时才初始化单例,又能保证线程安全,并且单例对象初始化后调用getInstance()方法不进行同步锁。
该实现方式最大的优点在于getInstance()方法上,针对于instance对象进行了两次验证是否为NULL;这两种判断主要做了三件事情:
(1)给Singleton实例对象分配内存(2)调用Singleton的构造函数,初始化成员字段(3)将instance对象指向分配的内存空间;
实例代码如下:
public class Singleton{
static Singleton instance=null;
private void Singleton(){}
public static Singleton getInstance(){
if(instance==null){
synchronized(Singleton.class){
instance=new Singleton();
}
}
return instance;
}
}
3、静态内部类单例模式
在Singleton类中声明一个静态内部类,静态类里实现单例对象的实例化,这样既可以确保线程安全,也可保证单例对象唯一性,同时延迟单例的实例化,这是比较推荐的一种方式。
public class Singleton{
static Singleton instance=null;
private void Singleton(){}
public static Singleton getInstance(){
return SingletonTool.instance;
}
/****静态内部类****/
private static class SingletonTool{
private static final Singleton instance=new Singleton();
}
}
单例模式优点:减少内存开支,避免资源浪费,常住内存,实现全局数据管理和共享;
单例模式缺点:扩展难,如果在Android中持有Context,容易造成内存泄漏,最好使用Application Context;
Android中的单例模式的更多相关文章
- android开发学习 ------- 【转】 android中的单例模式 (详解)
https://blog.csdn.net/u011418943/article/details/60139644 这篇文章 前因后果 都说出来了 ,值得学习. https://blog.cs ...
- Android中的创建型模式总结
共5种,单例模式.工厂方法模式.抽象工厂模式.建造者模式.原型模式 单例模式 定义:确保某一个类的实例只有一个,而且向其他类提供这个实例. 单例模式的使用场景:某个类的创建需要消耗大量资源,new一个 ...
- Android中处理崩溃异常
转自:http://my.eoe.cn/817027/archive/17997.html 大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不 ...
- Android中处理崩溃异常和记录日志
大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了 ...
- Android中处理崩溃异常CrashHandler
来源:http://blog.csdn.net/liuhe688/article/details/6584143 大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程 ...
- [Android]GOF23种设计模式 & Android中的设计模式
GOF23种设计模式 设计原则: 1. 单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因 2. 开放-封闭原则(OCP):软件实体(类.模块.函数等)应该可以扩展,但是不可修改.即对 ...
- 系统剖析Android中的内存泄漏
[转发]作为Android开发人员,我们或多或少都听说过内存泄漏.那么何为内存泄漏,Android中的内存泄漏又是什么样子的呢,本文将简单概括的进行一些总结. 关于内存泄露的定义,我可以理解成这样 没 ...
- 【转】Android中处理崩溃异常
大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了 ...
- Android 设计模式 之 单例模式
http://blog.csdn.net/fangchongbory/article/details/7734199 目录(?)[+] 单例模式常见情景 首先实现1中的单例模式A 实现2中单例模式 ...
随机推荐
- C#实现二叉树的各种遍历
1. 引言 在实际的项目中,树还是用的比较多的一种,尤其是对于具有层次结构的数据.相信很多人都学过树的遍历,比如先序遍历,后序遍历等,利用递归还是很容易理解的. 今天给大家介绍下二叉树的几种遍历算法, ...
- 用于PHP的Gearman Worker管理工具GearmanManager
项目地址:https://github.com/brianlmoon/GearmanManager PHP环境要求 PHP 5.5.9 POSIX extension Process Control ...
- js的动态加载、缓存、更新以及复用(三)
总体思路 1. 建立一个js服务,该服务实现通用js文件的加载.依赖.缓存.更新以及复用. 2. 各个项目如果使用通用js,可(bi)以(xu)使用js服务实现加载. 3. Js服务只提供通用的 ...
- 常用的css命名规则:
关于团队合作的css命名规范 常用的css命名规则: 头:header 内容:content/container 尾:footer 导航:nav 侧栏:sidebar 栏目:column 页面外围控制 ...
- jquery实现输入框实时输入触发事件代码
$('.aa').bind('input propertychange', function() { searchProductClassbyName(); }); function searchPr ...
- MySQL索引类型 btree索引和hash索引的区别
来源一 Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 ...
- [deviceone开发]-土地销售App开源
一.简介 这个是一个真实项目改造开源,虽然不是很花哨,但是中规中矩,小细节处理的也很好,非常值得参考和借鉴.里面的数据都缓存到本地,可以离线运行,但是调整一下代码,马上就可以和服务端完全对接.后续会有 ...
- iOS 使用AFNetworking遇到错误 Request failed: unacceptable content-type: text/html
错误日志: Error Domain=com.alamofire.error.serialization.response Code=-1016 "Request failed: unacc ...
- SAP查询事务、表属于哪个模块
这个功能主要是在汇报SAP的产品问题时,让你知道该选择你所汇报的问题所哪个子模块的.它可以依据事务代码.表.程序名.域.数据元素来查找. 方法:SE38,执行报表程序:RSSTATUS .
- 利用ARCHPR明文破解获取PDF
我们经常下载一些rar或zip压缩文件,解压时有时发现要密码,而密码多是为了推广而设置的网址等,如果不知道密码,可 以去来源网站上寻找或在压缩文件的注释中查看. 而并非所有都是如此,例如,网上有些人, ...