单例模式,可以说是GOF的23种设计模式中最简单的一个。
这个模式相对于其他几个模式比较独立,它只负责控制自己的实例化数量单一(而不是考虑为用户产生什么样的实例),很有意思,是一个感觉上很干净的模式,本人很喜欢这个模式。
android中很多地方都用到了单例模式,本文以输入法管理者InputMethodManager为例,展开分析。
单例模式,Singleton Pattern,能够以其特有的优势,替代系统中全局变量,应用非常广泛。
1.意图
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
热门词汇:单例 唯一 私有构造
2.结构
android中有很多系统级别的全局变量,如时间,输入法,账户,状态栏等等,android中对这些都直接或者有些间接用到了单例模式。
以输入法为例,把上图修改为实际情况:
非常的简单,但是有一点,从上面我们也看到了synchronized关键字,在多线程的环境下,单例模式为了保证自己实例数量的唯一,必然会做并发控制。
类似这种线程安全的单例,跨进程的单例,参数化的单例等等的情况,确实超出本文的范围,而且都涉及到很多东西,是一个很大的话题,不好展开。
3. 代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
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()方法中如下调用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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).比类操作更灵活。
相关推荐
10. **代码组织和设计模式**: 分析源码的结构,可以学习到良好的代码组织方式,比如模块化、面向对象设计,以及可能用到的设计模式,如单例模式、观察者模式等。 通过研究这个源码,开发者不仅可以掌握一键锁屏的...
5. **学习设计模式**:Android源码中广泛应用了设计模式,如观察者模式、单例模式等,阅读源码能提升开发者的设计能力。 总之,"android源码 jar包" 是一个宝贵的资源,它能够帮助进阶的Android开发者提升技能,...
源码中可能运用了单例模式、观察者模式等设计模式,如单例的ContentProvider实例,观察者模式用于监听日历事件的变化。 12. **UI交互**: 通过OnClickListener、OnTouchListener等接口,实现用户点击、滑动等交互...
通过分析Android源码,这本书揭示了系统内部的设计模式和最佳实践,帮助开发者提高代码质量和可维护性。它涵盖了单例模式、工厂模式、观察者模式以及MVC、MVP和MVVM架构模式。 6. 《安卓艺术探索》 这本书关注于...
此外,Android SDK源码中也有许多策略模式、适配器模式、单例模式等设计模式的应用。 6. **总结** 工厂方法模式在Android开发中扮演着重要的角色,它提供了一种灵活的方式来创建对象,同时保持了代码的解耦和可...
- 源码可能包含单例模式、观察者模式、工厂模式等设计模式,这对于理解和优化代码结构至关重要。 通过对这些关键知识点的学习,开发者不仅能理解这个自定义锁屏应用的工作原理,还能提升Android应用开发的能力。...
- Android开发中常用的设计模式包括单例模式、工厂模式、观察者模式等,源码分析可以帮助理解如何在实际项目中应用这些模式。 12. **第三方库** - 开发者常使用第三方库如ButterKnife(视图注入)、Retrofit...
源码中会体现出各种设计模式的应用,如单例模式、工厂模式、观察者模式等,它们帮助代码结构清晰,易于维护。 9. **Android框架扩展** LumaQQ可能使用了第三方库,如RxJava进行响应式编程,Dagger进行依赖注入,...
WallpaperManagerSample.rar”中的源码,通过分析WallpaperManagerSample,我们将探讨如何利用Android系统的WallpaperManager服务来设置和管理壁纸,以及在这个过程中涉及到的设计模式和技术要点。 ...
5. **设计模式**:标签中提到了"优秀设计模式",源码可能采用了单例模式、观察者模式或者MVC(模型-视图-控制器)、MVVM(模型-视图-ViewModel)等架构模式,以提高代码的可读性和可维护性。 6. **事件监听**:用户...
- **设计模式**:识别并理解源码中使用的常见设计模式,如单例、工厂、观察者等。 - **问题解决**:通过阅读和分析他人的代码,提高解决问题的能力,遇到类似问题时能更快找到解决方案。 总之,这个压缩包对于希望...
8. **游戏设计模式**: - 观察者模式用于事件处理,如按键事件、触摸事件。 - 单例模式用于管理全局资源,如音乐播放器、网络连接等。 - 工厂模式用于动态创建游戏对象。 以上就是“Android应用源码之(游戏视图...
源码中可能运用了多种设计模式,如单例模式、工厂模式、观察者模式等,这些模式在解决特定问题时能提高代码的可读性和可维护性。此外,源码还可能展示了如何有效地管理内存,避免内存泄漏,以及如何优化UI性能,提升...
- **学习设计模式**:Android源码中广泛运用了各种设计模式,如单例、工厂、观察者等,这对于提升编程技巧很有帮助。 - **自定义实现**:对于Android的一些默认行为不满意,可以基于源码进行定制和扩展。 4. **...
你可以看到每个功能是如何通过代码实现的,了解各种设计模式的实际应用,比如单例模式、工厂模式等。此外,还可以学习到如何进行单元测试,确保代码的健壮性。更重要的是,通过对比不同解决方案,你可以形成自己的...
12. **最佳实践和设计模式**:源码可能还会涉及一些Android开发的最佳实践,比如单例模式、MVP或MVVM架构模式的应用。 通过研究`budi-kurniawan-java4android2-examples-1d5a9b6ffc21`这个压缩包中的源码,开发者...
在阅读源码时,关注类的设计模式,如单例模式(用于管理SDK实例)、观察者模式(用于事件回调)等,这些都是Android开发中的常见设计模式。同时,注意代码的结构和组织,了解如何通过模块化和组件化来提高代码的...
这篇文档将深入解析《安卓开发-安卓冒险游戏源码可直接运行类似于精灵快跑这种可做毕业设计》的源码,旨在为安卓开发者提供一份详细的学习指南,特别是对于那些正在寻找毕业设计项目的同学。我们将讨论游戏开发的...
常见的设计模式如单例模式、工厂模式、观察者模式等可能会在项目中体现,有助于理解软件架构和模块化设计。 6. **文件组织与命名规范**:“java环境说明.docx”可能是关于如何配置和设置Java开发环境的文档,而...