Android扩展应用程序模式的疑虑

时间:2014-11-26 18:36:18

标签: android application-singleton

我已将我的应用程序扩展到我的Android应用程序中,以便存储我在我的应用程序中使用的不同字体。一切都运行正常,但是我不理解代码的单例部分和getInstance的目标是什么(我在那里设置了一个断点,它永远不会被调用,如果我改变方法的名称,应用程序工作正常好)。有人可以告诉我这种模式吗?我通常不会使用OOP,所以这可能是一个愚蠢的问题。

MyApplication.java

    public class MyApplication extends Application {
    private Typeface _typefaceNormal;
    private Typeface _typefaceBold;

    private static MyApplication singleton;

    public MyApplication getInstance() {
        return singleton;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        singleton = this;
        this._typefaceNormal = Typeface.createFromAsset(getAssets(),"PTS55F.TTF");
        this._typefaceBold = Typeface.createFromAsset(getAssets(), "PTS75F.TTF");
    }

    public Typeface getNormalFont() {
        return this._typefaceNormal;
        // return this._typefaceNormal;
    }

    public Typeface getBoldFont() {
        return this._typefaceBold;
        // return this._typefaceBold;
    }
}

然后我这样打电话:

this._typeface = ((MyApplication) _activity.getApplicationContext()).getNormalFont();

修改

从我收集的答案和其他一些研究中,这是我最终使用的课程:

    public class MyGlobalConfig {
    private static MyGlobalConfig singleton;
    private Typeface _typefaceNormal;
    private Typeface _typefaceBold;

    private MyGlobalConfig() {

    }

    public static MyGlobalConfig getInstance() {
        if (singleton == null) {
            singleton = new MyGlobalConfig();
        }
        return singleton;
    }

    public void init(Context ctx, String typefaceNormal, String typefaceBold) {
        this._typefaceNormal = Typeface.createFromAsset(ctx.getAssets(),
                typefaceNormal);
        this._typefaceBold = Typeface.createFromAsset(ctx.getAssets(),
                typefaceBold);
    }

    public Typeface getNormalFont() {
        return this._typefaceNormal;
        // return this._typefaceNormal;
    }

    public Typeface getBoldFont() {
        return this._typefaceBold;
        // return this._typefaceBold;
    }
}

我将其初始化为:

MyGlobalConfig.getInstance().init(getApplicationContext(), normalFont, boldFont);

将我的字体设置为:

MyGlobalConfig.getInstance().getNormalFont();

2 个答案:

答案 0 :(得分:2)

单例模式的目的是强制只能创建一个类的一个实例。但是你并没有真正实现这一目标。在Java中执行此操作的正确方法是将构造函数设置为private,然后将静态变量设置为类的singleton实例。例如:

public class MySingletonClass{
  private static MySingletonClass singleton;

  // private constructor
  private MySingletonClass(){}

  public static MySingletonClass getInstance(){
   if(singleton == null){
     singleton = new MySingletonClass();
   }
   return singleton;
  }
}

在使用Android时,无需使Application类成为单例。 Android将只创建一个实例并为您管理它。此外,由于Application类已经定义了公共构造函数,我不相信编译器会允许您在扩展类中使构造函数成为私有,因此您无法强制执行单例模式。

答案 1 :(得分:1)

那是因为您没有使用静态方法MyApplication.getInstance()。相反,您正在通过context.getApplicationContext()访问引用,在这种情况下,它会产生与" singleton"相同的引用。静态变量。

通过静态方法访问实例getInstance()使您能够在不使用上下文引用的情况下访问它,并使您免于转换((MyApplication)_activity.getApplicationContext())。从不好的方面来说,它会将您的代码耦合在一起并使其更难以测试。