定义:

单例模式:确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

使用场景:

确保某一个类有且只有一个对象的场景,避免产生多个对象消耗过多的资源,或者某种类型的对象只应该有且只有一个。

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中的单例模式的更多相关文章

  1. android开发学习 ------- 【转】 android中的单例模式 (详解)

    https://blog.csdn.net/u011418943/article/details/60139644     这篇文章 前因后果 都说出来了 ,值得学习. https://blog.cs ...

  2. Android中的创建型模式总结

    共5种,单例模式.工厂方法模式.抽象工厂模式.建造者模式.原型模式 单例模式 定义:确保某一个类的实例只有一个,而且向其他类提供这个实例. 单例模式的使用场景:某个类的创建需要消耗大量资源,new一个 ...

  3. Android中处理崩溃异常

    转自:http://my.eoe.cn/817027/archive/17997.html 大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不 ...

  4. Android中处理崩溃异常和记录日志

    大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了 ...

  5. Android中处理崩溃异常CrashHandler

    来源:http://blog.csdn.net/liuhe688/article/details/6584143 大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程 ...

  6. [Android]GOF23种设计模式 & Android中的设计模式

    GOF23种设计模式 设计原则: 1. 单一职责原则(SRP):就一个类而言,应该仅有一个引起它变化的原因 2. 开放-封闭原则(OCP):软件实体(类.模块.函数等)应该可以扩展,但是不可修改.即对 ...

  7. 系统剖析Android中的内存泄漏

    [转发]作为Android开发人员,我们或多或少都听说过内存泄漏.那么何为内存泄漏,Android中的内存泄漏又是什么样子的呢,本文将简单概括的进行一些总结. 关于内存泄露的定义,我可以理解成这样 没 ...

  8. 【转】Android中处理崩溃异常

    大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了 ...

  9. Android 设计模式 之 单例模式

    http://blog.csdn.net/fangchongbory/article/details/7734199   目录(?)[+] 单例模式常见情景 首先实现1中的单例模式A 实现2中单例模式 ...

随机推荐

  1. EntityFramework中几种更改数据的方式

    首先声明个实体类,该实体类是EntityFrameWork自动生成的,对应数据表Test结构如下 public partial class Test { public int Id{ get; set ...

  2. 基于.Net Framework 4.0 Web API开发(2):ASP.NET Web APIs 参数传递方式详解

    概述:  ASP.NET Web API 的好用使用过的都知道,没有复杂的配置文件,一个简单的ApiController加上需要的Action就能工作.调用API过程中参数的传递是必须的,本节就来谈谈 ...

  3. 修正 ColorPanel 选色缓慢问题

    问题:TColorPanel 在运行时,选取颜色都会重绘,造成选色缓慢. 适用:Delphi XE5 修正:找出 FMX.Colors.pas 档案,并复制到自己的 Project 路径里,找到 TC ...

  4. Oracle to_char()函数的使用细则

    Oracle to_char()函数的使用细则,学习连接 http://www.cnblogs.com/reborter/archive/2008/11/28/1343195.html

  5. 框架Maven笔记系列 一 基础

    主题:SpringMVC 学习资料参考网址: 1.http://www.icoolxue.com 2.http://maven.apache.org/ 1.Maven解决了什么问题? Maven基于项 ...

  6. Servlet生命周期及工作原理

    1 Servlet生命周期Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁. init():在Servlet的生命周期中,仅执行一次init()方 ...

  7. display---我的第一篇博客

    display:block显示为块级元素,换行 display:inline-block显示为块级内联元素,不换行,但是可以改变其宽度高度 display:inline显示为内联元素,不换行但是也不能 ...

  8. 如何在没有安装微软Excel环境下操作Excel文件?

    在以前接触的项目中,由于很多客户对微软Excel的操作比较熟练,客户经常要求系统支持对Excel文件的读写.用.NET传统方法对Excel进行读写时,往往会涉及到不同版本兼容的问题,导致在本地测试一切 ...

  9. css居中完全指南(翻译)

    最近参加了百度的前端技术学院,任务4是要求一个元素在父元素中水平和垂直居中,提供的一篇文章对各种情况都进行了分析,很不错,英文也不是那么难懂,毕竟代码还是主体,翻译过来分享出来,翻译内容带有自己的理解 ...

  10. 使用Unity3D的50个技巧

    使用Unity3D的50个技巧 刚开始学习Unity3D时间不长,在看各种资料.除了官方的手册以外,其他人的经验也是非常有益的.偶尔看到老外这篇文章,觉得还不错,于是翻译过来和大家共享.原文地址:ht ...