Android 设计模式-单例模式

Android 设计模式-单例模式

什么情况下需要单例模式?

  • 一些类提供公共功能供别人调用,本身不会处理业务逻辑
  • 类会被许多类和线程调用

设计单例模式

public class Singleton{
private static Singleton mSingleton;
private Singleton(){
}
public static Singleton getInstance(){
if(mSingleton == null){
     mSingleton = new Singleton();\\A
    }
    return mSingleton;
  }
}

上面的做法在多线程的时候会出现问题,比如有两个线程同时调用getInstance(),这时会new两个对象出来。

单例模式改进1

public class Singleton{
private static Singleton mSingleton;
private Singleton(){
}
public static Singleton getInstance(){
  synchronized(Singleton.class){
    if(mSingleton == null){
     mSingleton = new Singleton();\\A
    }
    return mSingleton;
   }
  }
}

这种方式还是会有问题,就是高并发情况下多线程去抢夺锁,假如有几百个线程,其中有一个运气比较差,这个线程就会出现一直去getInstance,资源一直返回不回去,UI也不会得到更新。

单例模式改进2

public class Singleton{
private volatile static Singleton mSingleton;
private Singleton(){
}
public static Singleton getInstance(){
  if(mSingleton == null){\\A
    synchronized(Singleton.class){\\C
     if(mSingleton == null)
      mSingleton = new Singleton();\\B
      }
    }
    return mSingleton;
  }
}

注:volatile是防止cpu进行指令重排序,防止代码顺序被更改。

这种方式比较好的地方在于第一次创建实例时候就会同步所有的线程,以后再获取实例就会直接返回。

但是看代码好像还是有人会有疑问,为什么需要两次判断为null?

其实这个意义在于防止多个线程同时进入第一个if内,比如说线程A执行到A行,线程B执行到B行,线程B还没有返回。当线程A执行到C行,这时线程B初始化实例完毕,如果没有里面的再一次判断就会生成两个实例!所以两次的判断null还是有意义的。

时间: 2024-11-18 06:20:56

Android 设计模式-单例模式的相关文章

Android设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

Android开发中的设计模式—单例模式的详细解释

Android开发中的设计模式-单例模式的详细解释: 1. 单例模式的特点: (1).保证一个类只有一个实例 (2).提供一个能访问到他的全局访问点. (3).构造函数声明为私有的,从而阻止了在类外创建对象 2. 种类: (1).饿汉式单例模式 (2).懒汉式单例模式 3. 代码分析: (1).饿汉式单例模式: //类加载的时候对象就实例化了. private static Single mSingle = new Single(); public static Single getInstan

Android 设计模式 之 单例模式

http://blog.csdn.net/fangchongbory/article/details/7734199 目录(?)[+] 单例模式常见情景 首先实现1中的单例模式A 实现2中单例模式B 实现3单例模式C 实现4单例模式D 可带参数单例模式E 终极版单例模式F android中源码单例模式举例 日历模块 Collator类 Editable类 AccessibilityManager类 1.单例模式常见情景 设计模式中,最简单不过的就是单例模式.先看看单例模式 原文:http://w

Android中的设计模式-单例模式

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

php设计模式——单例模式(Singleton)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 谷歌的Android设备 华为的Android设备 IOS只属于苹果公司 IOS只属于苹果公司 1 <?php 2 3 /* 4 * php

经常使用的android设计模式

一般来说,经常使用的android设计模式有下面8种:单例.工厂.观察者.代理.命令.适配器.合成.訪问者. 单例模式:目的是为了让系统中仅仅有一个调用对象,缺点是单例使其它程序过分依赖它,并且不同单例执行在不同进程中.使得维护困难: 工厂模式:生产固定的一些东西,如抽象类,缺点是产品改动麻烦:如喜欢动作片和爱情片的人分别向server发出同一个请求.就能够得到他们想看的影片集,相当于不同对象进行同一请求,需求均得到满足. 观察者模式:就是多个对象对一个对象进行监控,如缓存: 代理模式:自己的事

Android设计模式——抽象工厂模式(Abstract Factory)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import

Android设计模式——工厂方法模式(Factory Method)

二十三种设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 1 package com.example.main; 2 3 import android.app.Activity; 4 import