我已将我的应用程序扩展到我的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();
答案 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())。从不好的方面来说,它会将您的代码耦合在一起并使其更难以测试。