单例模式,可以说是GOF的23种设计模式中最简单的一个。
这个模式相对于其他几个模式比较独立,它只负责控制自己的实例化数量单一(而不是考虑为用户产生什么样的实例),很有意思,是一个感觉上很干净的模式,本人很喜欢这个模式。
android中很多地方都用到了单例模式,本文以输入法管理者InputMethodManager为例,展开分析。
单例模式,Singleton Pattern,能够以其特有的优势,替代系统中全局变量,应用非常广泛。
1.意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
热门词汇:单例 唯一 私有构造
2.结构
android中有很多系统级别的全局变量,如时间,输入法,账户,状态栏等等,android中对这些都直接或者有些间接用到了单例模式。
以输入法为例,把上图修改为实际情况:
非常的简单,但是有一点,从上面我们也看到了synchronized关键字,在多线程的环境下,单例模式为了保证自己实例数量的唯一,必然会做并发控制。
类似这种线程安全的单例,跨进程的单例,参数化的单例等等的情况,确实超出本文的范围,而且都涉及到很多东西,是一个很大的话题,不好展开。
3. 代码:
- public final class InputMethodManager {
- static final Object mInstanceSync = new Object();//同步
- //内部全局唯一实例
- static InputMethodManager mInstance;
- //对外api
- static public InputMethodManager getInstance(Context context) {
- return getInstance(context.getMainLooper());
- }
- /**
- * 内部api,供上面的外部api调用
- * @hide 系统隐藏的api
- */
- 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;
- }
- }
客户端调用,比如contextimpl中的getSystemService()方法中如下调用:
- class ContextImpl extends Context{
- @Override
- public Object getSystemService(String name) {
- if (WINDOW_SERVICE.equals(name)) {
- //... ... 省略下面n个if,else if
- } else if (INPUT_METHOD_SERVICE.equals(name)) {
- //获取输入法管理者唯一实例
- return InputMethodManager.getInstance(this);
- } else if (KEYGUARD_SERVICE.equals(name)) {
- //... ... 省略下面n个if,else if
- } else if (ACCESSIBILITY_SERVICE.equals(name)) {
- //又见单例,无处不在
- return AccessibilityManager.getInstance(this);
- } else if (LOCATION_SERVICE.equals(name)) {
- //... ... 省略下面n个if,else if
- } else if (NFC_SERVICE.equals(name)) {
- return getNfcManager();
- }
- return null;
- }
- }
非常简单,干净的一个模式。
4.效果
(1).创建型模式。
(2).对唯一实例的受控访问。
(3).避免全局变量污染命名空间。
(4).允许对操作和表示的精化。
(5).比类操作更灵活。
出自http://mobile.51cto.com/ahot-418975.htm
相关推荐
android 单例模式 干货 告诉你哪种单例模式最实用 最好用 不再迷茫
单例模式是软件设计模式的一种,其主要目的是确保一个类只有一个实例,并且提供一个全局访问点来获取这个实例。在Android系统中,单例模式被广泛应用于管理那些需要全局共享的资源,例如输入法管理者...
在实际项目中,我们还可以结合其他设计模式,如单例模式(用于管理全局策略)和工厂模式(用于创建策略对象),进一步提升代码的结构和质量。总之,策略模式是Android应用开发中一个强大的工具,值得开发者深入理解...
本人深圳安卓开发程序猿一枚,希望能一起...最近重温了一下java的设计模式,练练手,java设计模式有23种,写了12种常用的设计模式,一些觉得用不上就没写,水平有限,有问题欢迎留言一起加油email:674928145@qq.com!
### Java和Android源码设计模式解析 #### 前言:设计模式的重要性 设计模式是软件工程中的一个重要概念,它代表了一种最佳实践,能够帮助开发者解决常见的编程问题。掌握设计模式不仅能够提升代码的质量,还能提高...
详细讲解了组合模式、观察者模式、单例模式、模板方法模式、备忘录模式、享元模式、命令模式、工厂方法模式、适配器模式 原型模式等10个Android设计模式,和CSDN上其他讲Android设计模式的文章完全不同。讲解详细,...
本文实例讲述了Android编程设计模式之单例模式。分享给大家供大家参考,具体如下: 一、介绍 单例模式是应用最广的模式之一,也可能是很多初级工程师唯一会使用的设计模式。在应用这个模式时,单例对象的类必须保证...
Android 设计模式系列还包括工厂方法模式、抽象工厂模式、创建者模式、原型模式、单例模式、适配器模式、桥模式、组合模式、装饰模式、外观模式、享元模式、代理模式、解释器模式、模板方法模式、职责链模式、命令...
"android设计模式"这一主题,主要涵盖了一些常见的设计原则、模式以及如何在Android环境中应用它们。《设计模式之禅》作为一本经典著作,其深入浅出的讲解方式使得读者能够轻松掌握设计模式的核心理念。 1. **设计...
### Android设计模式概述 #### 设计模式定义 设计模式是软件工程领域的一个重要概念,它代表着在特定场景下解决常见问题的有效方法。对于Android开发者而言,了解并掌握这些设计模式能够帮助他们编写更加高效、可...
在Android开发中,设计模式是提升代码质量和可维护性的重要工具。设计模式是对软件设计中常见问题的解决方案的模板,经过时间和实践的检验,能够帮助开发者有效地解决复杂性问题,提高代码的重用性和可扩展性。本...
"Android设计模式"这个主题涵盖了多种在Android系统源码以及应用程序开发中常用的设计模式。这些模式是解决常见编程问题的成熟方案,通过理解和应用它们,可以显著提高代码质量。 设计模式分为三大类:创建型模式、...
单例模式是软件设计模式中的一种,属于创建型模式,但有时被称作“非创建型模式”。在单例模式中,设计者的目标是确保一个类只有一个实例,并且提供一个全局访问点给这个实例。在多线程和并发环境中,单例模式的实现...
主要介绍了android设计模式中的单例模式详解,需要的朋友可以参考下
总的来说,《Android源码设计模式解析与实战》是一本深入浅出的Android设计模式教程,对于希望提升Android开发技能的工程师来说,是一份不可多得的学习资料。通过对书中的知识点进行深入学习和实践,开发者将能更好...
接下来,单例模式是一种设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在Android中,单例模式常用于网络请求、数据库操作、偏好设置等场景。实现单例通常有懒汉式(线程不安全)、饿汉式(线程安全)...
单例模式是设计模式中最常见也最简单的一种设计模式,保证了在程序中只有一个实例存在并且能全局的访问到。比如在Android实际APP 开发中用到的 账号信息对象管理, 数据库对象(SQLiteOpenHelper)等都会用到单例...