当前位置: 首页 > 科技观察

Android设计模式系列-单例模式

时间:2023-03-12 10:25:03 科技观察

单例模式可以说是GOF的23种设计模式中最简单的了。这种模式相对独立于其他模式。它只负责控制实例化的单个数量(而不是考虑为用户生成什么样的实例)。这是非常有趣且非常干净的模式。我非常喜欢它。模型。android中很多地方都用到了单例模式。本文以输入法管理器InputMethodManager为例进行分析。单例模式SingletonPattern以其独特的优势可以替代系统中的全局变量,被广泛使用。1.意图是保证一个类只有一个实例,并提供一个全局访问点来访问它。热词:单例私有结构2.结构android中有很多系统级的全局变量,比如时间、输入法、账号、状态栏等,android对这些直接或间接使用了单例模式。以输入法为例,根据实际情况修改上图:很简单,但是有一点,我们也从上面看到了synchronized关键字,在多线程环境下,单例模式保证了最大实例数*,势必要做并发控制。诸如此类的线程安全单例、跨进程单例、参数化单例等等确实不在本文的讨论范围之内,涉及的东西也很多。这是一个很大的话题,不容易扩展。3.代码:publicfinalclassInputMethodManager{staticfinalObjectmInstanceSync=newObject();//同步//内部全局***实例staticInputMethodManagerInstance;//外部apistaticpublicInputMethodManagergetInstance(Contextcontext){returnetInstance(context.getMainLooper());}/***内部api,对于上面的外部api调用*@hidesystemhiddenapi*/staticpublicInputMethodManagergetInstance(LoopermainLooper){synchronized(mInstanceSync){if(mInstance!=null){returnmInstance;}IBinderb=ServiceManager.getService(Context.INPUT_METHOD_SERVICE);IInputMethodManagerservice=IInputMethodManagerservice=IInputMethod.Stub.asInterface(b);mInstance=newInputMethodManager(service,mainLooper);}returnmInstance;}}客户端调用,比如contextimpl中getSystemService()方法中的如下调用:classContextImplextendsContext{@OverridepublicObjectgetSystemService(Stringname){if(WINDOW_SERVICE.equals(name)){//...省略后面的nif,elseif}elseif(INPUT_METHOD_SERVICE.equals(name)){//获取input方法管理器***实例returnInputMethodManager.getInstance(this);}elseif(KEYGUARD_SERVICE.equals(name)){//...省略后面的nif,elseif}elseif(ACCESSIBILITY_SERVICE.equals(name)){//又见单例,无处不在.equals(name)){returngetNfcManager();}returnull;}}是一种非常简单干净的模式4.效果(1)。创造模式。(2).控制对黑客实例的访问。(3).避免全局变量污染命名空间。(4).允许细化操作和表示。(5).比类操作更灵活。