手机
当前位置:查字典教程网 >编程开发 >安卓软件开发 >Android源码学习之单例模式应用及优点介绍
Android源码学习之单例模式应用及优点介绍
摘要:单例模式定义:Ensureaclasshasonlyoneinstance,andprovideaglobalpointofaccessto...

单例模式定义:

Ensure a class has only one instance, and provide a global point of access to it.

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

Android源码学习之单例模式应用及优点介绍1

如上图所示(截取自《Head First Design Patterns》一书)。

Android源码学习之单例模式应用及优点介绍2

通过使用private的构造函数确保了在一个应用中产生一个实例,并且是自行实例化(在Singleton中自己使用new Singleton())。

具体单例模式有什么优点呢:

由于单例模式在内存中只有一个实例,减少了内存开销。

单例模式可以避免对资源的多重占用,例如一个写文件时,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作。

单例模式可以再系统设置全局的访问点,优化和共享资源访问。

其中使用到单例模式时,考虑较多的就是多线程的情况下如何防止被多线程同时创建等问题,其中《Head First Design Patterns》使用到“double-checked locking”来降低使用synchronization。

复制代码 代码如下:

public class Singleton {

/* The volatile keyword ensures that multiple threads

* handle the uniqueInstance variable correctly when it

* is being initialized to the Singleton instance.

* */

private volatile static Singleton uniqueInstance;

private Singleton() {}

public static Singleton getInstance() {

if(uniqueInstance == null) {

synchronized (Singleton.class) {

if(uniqueInstance == null) {

uniqueInstance = new Singleton();

}

}

}

return uniqueInstance;

}

}

在Android源码中,使用到单例模式的例子很多,如:

一、 如InputMethodManager类

复制代码 代码如下:

public final class InputMethodManager {

static final boolean DEBUG = false;

static final String TAG = "InputMethodManager";

static final Object mInstanceSync = new Object();

static InputMethodManager mInstance;

final IInputMethodManager mService;

final Looper mMainLooper;

创建唯一的实例static InputMethodManager mInstance;

复制代码 代码如下:

/**

* Retrieve the global InputMethodManager instance, creating it if it

* doesn't already exist.

* @hide

*/

static public InputMethodManager getInstance(Context context) {

return getInstance(context.getMainLooper());

}

/**

* Internally, the input method manager can't be context-dependent, so

* we have this here for the places that need it.

* @hide

*/

static public InputMethodManager getInstance(Looper mainLooper) {

synchronized (mInstanceSync) {

if (mInstance != null) {

return mInstance;

}

IBinder b = ServiceManager.getService(Context.INPUT_METHOD_SERVICE);

IInputMethodManager service = IInputMethodManager.Stub.asInterface(b);

mInstance = new InputMethodManager(service, mainLooper);

}

return mInstance;

}

防止多线程同时创建实例:

复制代码 代码如下:

synchronized (mInstanceSync) {

if (mInstance != null) {

return mInstance;

}

当没有创建实例对象时,调用mInstance = new InputMethodManager(service, mainLooper);

其中类构造函数如下所示:

复制代码 代码如下:

InputMethodManager(IInputMethodManager service, Looper looper) {

mService = service;

mMainLooper = looper;

mH = new H(looper);

mIInputContext = new ControlledInputConnectionWrapper(looper,

mDummyInputConnection);

if (mInstance == null) {

mInstance = this;

}

}

二、BluetoothOppManager类

复制代码 代码如下:

public class BluetoothOppManager {

private static final String TAG = "BluetoothOppManager";

private static final boolean V = Constants.VERBOSE;

// 创建private static类实例

private static BluetoothOppManager INSTANCE;

/** Used when obtaining a reference to the singleton instance. */

private static Object INSTANCE_LOCK = new Object();

。。。

/**

* Get singleton instance.

*/

public static BluetoothOppManager getInstance(Context context) {

synchronized (INSTANCE_LOCK) {

if (INSTANCE == null) {

INSTANCE = new BluetoothOppManager();

}

INSTANCE.init(context);

return INSTANCE;

}

}

三、AccessibilityManager类

复制代码 代码如下:

public final class AccessibilityManager {

private static final boolean DEBUG = false;

private static final String LOG_TAG = "AccessibilityManager";

/** @hide */

public static final int STATE_FLAG_ACCESSIBILITY_ENABLED = 0x00000001;

/** @hide */

public static final int STATE_FLAG_TOUCH_EXPLORATION_ENABLED = 0x00000002;

static final Object sInstanceSync = new Object();

private static AccessibilityManager sInstance;

...

/**

* Get an AccessibilityManager instance (create one if necessary).

*

* @hide

*/

public static AccessibilityManager getInstance(Context context) {

synchronized (sInstanceSync) {

if (sInstance == null) {

IBinder iBinder = ServiceManager.getService(Context.ACCESSIBILITY_SERVICE);

IAccessibilityManager service = IAccessibilityManager.Stub.asInterface(iBinder);

sInstance = new AccessibilityManager(context, service);

}

}

return sInstance;

}

/**

* Create an instance.

*

* @param context A {@link Context}.

* @param service An interface to the backing service.

*

* @hide

*/

public AccessibilityManager(Context context, IAccessibilityManager service) {

mHandler = new MyHandler(context.getMainLooper());

mService = service;

try {

final int stateFlags = mService.addClient(mClient);

setState(stateFlags);

} catch (RemoteException re) {

Log.e(LOG_TAG, "AccessibilityManagerService is dead", re);

}

}

等等。。。

新年的第一周的开始,从最简单的单例模式开始记录自己的学习过程吧~~~

【Android源码学习之单例模式应用及优点介绍】相关文章:

Android 情景模式的设置代码

Android绑定添加了注解的控件,及其事件方法

基于Android"今日事今日毕"的使用介绍

android内存优化之图片优化

Android开发:Android SDK的介绍

Android主流屏幕分辨率介绍

Android源码学习之工厂方法模式应用及优势介绍

Android控件系列之CheckBox使用介绍

Android 二维码扫描物流系统

Android 注册广播方式及优缺点

精品推荐
分类导航