標籤:android singleton
單例模式(Singleton)
單例模式是對象的建立模式,單例模式能夠確保某個類只有一個單一的執行個體對象存在,同時能夠自行執行個體化並將單一的執行個體提供給外界調用的特點,其在實際項目開發中經常被用到。
單例模式的結構圖說明如下:
結合上面的模式結構說明圖,我們可以看到單例模式有幾個顯著的特點,具體如下所示:
A、單例類(Singleton)只能有一個唯一的執行個體存在。
B、單例類必須有能夠自行建立自己的執行個體對象的能力。
C、單例類必須能夠給外界其他對象提供這個執行個體。
另外,對於單例模式從產生到現在,也已經有了幾種形式,下面我們就介紹幾種常用到的形式(以代碼的形式說明):
第一種形式:
/*
* 單例模式---形式1
*/
public class SingletonA {
private static final SingletonA instance =new SingletonA();
/* 私人構造子*/
private SingletonA() {
// CODE
}
/* 供外部調用的執行個體方法*/
public static SingletonA getInstance(){
return instance;
}
}
第二種形式:
/*
* 單例模式---形式2
*/
public class SingletonB {
private static SingletonB instance =null;
/* 私人構造子*/
private SingletonB() {
// CODE
}
/* 供外部調用的執行個體方法*/
public static SingletonB getInstance() {
if(null ==instance) {
instance = new SingletonB();
}
return instance;
}
}
第三種形式:
/*
* 單例模式---形式3
*/
public class SingletonC {
private static SingletonC instance =null;
/* 私人構造子*/
private SingletonC() {
// CODE
}
/* 供外界調用的執行個體方法 這裡用到了同步*/
public static synchronized SingletonC getInstance() {
if(null ==instance) {
instance = new SingletonC();
}
return instance;
}
}
當然,在這裡我只列出了比較常見到的幾種形式的單例,下面來具體的分析下他們之間的聯絡和區別,並在最後舉個實際的例子來使用單例模式。具體如下所示:
對於形式1的單例模式的特點就是在單例類自己被載入的時候就將自己執行個體化了。但從資源的利用率角度看的話,這種方式的實現會差一點;而第二種形式的單例模式是對第一種形式的小缺點做了最佳化,即在載入器載入單例類時不選擇建立執行個體對象,只有在真正需要這個單例的時候才去建立唯一的執行個體;如果從時間和反應的速度看的話,那麼形式1的單例要比形式2的要快些。對於形式3的單例,由於它使用了同步的機制,這樣勢必會降低它的效能,有利也有弊,它能夠很好的在非同步線程中保證執行個體的唯一性。
總的來說,形式1和形式2更符合Java機制,就我個人習慣於第二種形式的單例模式。下面具體舉個例子來說明單例的使用,當然我使用自己習慣的單例模式形式。例子是這樣的,在實際項目當中,我麼會經常的要擷取行動裝置的螢幕寬和高,那麼為了便於管理和統一,我們一般選擇將擷取寬和高的方法封裝在一個單一的類中,同時為了避免重複的建立這個類,我們選擇單例模式來實現。My Code如下:
單例模式:
/* 單例類*/
public class PhoneUtil {
private static PhoneUtil instance =null;
private static Context context =null;
/* 私人的構造子*/
private PhoneUtil(Context ctx) {
context = ctx;
}
/* 供外部調用的執行個體化方法 保證建立唯一的執行個體對象*/
public static PhoneUtil getInstance(Contextctx) {
if(null ==instance) {
instance = new PhoneUtil(ctx);
}
return instance;
}
/* 獲得螢幕的寬度*/
public int getScreenWidth() {
Display display = ((WindowManager)
context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
return display.getWidth();
}
/* 獲得螢幕的高度*/
public int getScreenHeight() {
Display display = ((WindowManager)
context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
return display.getHeight();
}
}
前端調用:
public class SingletonActivity extends Activity {
private static String TAG = "SingletonActivity";
@Override
protected void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_singleton);
int screenWidth = PhoneUtil.getInstance(this).getScreenWidth();
log("the screen width:" + screenWidth);
int screenHeight = PhoneUtil.getInstance(this).getScreenHeight();
log("the screen height:" + screenHeight);
}
private void log(String log) {
Log.d(TAG, log);
}
}
代碼的運行效果:
從上面的圖,My Phone的螢幕寬和高分別為320和480,看來解析度和螢幕小的可憐了!
好了,到這裡我們基本分析和使用了常用的單例模式。
技術交流群:179914858
單例模式在android中使用