3.3 单例模式

单例模式是最简单的模式,但它也是最具争议性的模式之一。许多开发者认为完全没有必要使用单例模式,将类声明为静态的可以更便捷地执行相同的函数。有时候静态类是更便捷的选择,但单例模式总被滥用。虽然两种实现方式都对,但有些时候明显其中一种更可取。

❑ 如果希望对传递的变量执行函数,请使用静态类。例如,计算价格变量的折扣值。

❑ 如果需要一个完整的对象,且对象只有一个实例,并希望对象可用于程序的任意部分,请使用单例模式。例如,一个对象代表当前登录到应用程序的单个用户。

如你所想,单例模式的类图非常简单,如图3-13所示。

图3-13

如图3-13所示,下边的示例会假设在任何时间,我们的应用程序仅有一个用户登录,并将创建一个在代码的任意部分都能访问的单例对象。

Android Studio在项目资源管理器的New(新建)菜单下提供了单例创建,因此我们可以从这里开始。此演示只有两个步骤,如下所示。

(1)将这个类添加到项目中:

    public class CurrentUser {
        private static final String DEBUG_TAG = "tag";
        private String name;
        //创建实例
        private static CurrentUser user = new CurrentUser();
        //保护类不被实例化
        private CurrentUser() {
        }
        //返回用户的唯一实例
        public static CurrentUser getUser() {
            return user;
        }
        //设置姓名
        protected void setName(String n) {
            name = n;
        }
        //输出用户姓名
        protected void outputName() {
            Log.d(DEBUG_TAG, name);
        }
    }
    (2)通过向活动中添加以下代码来测试模式。
    CurrentUser user = CurrentUser.getUser();
    user.setName("Singleton Pattern");
    user.outputName();

单例非常有用,但不用它也很容易。当任务是异步的(例如归档系统)时,以及当我们想要从代码中的任何位置访问其内容(例如前面示例中的用户名)时,使用单例模式非常方便。