編輯:關於Android編程
單例模式(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機制,就我個人習慣於第二種形式的單例模式。下面具體舉個例子來說明單例的使用,當然我使用自己習慣的單例模式形式。例子是這樣的,在實際項目當中,我麼會經常的要獲取移動設備的屏幕寬和高,那麼為了便於管理和統一,我們一般選擇將獲取寬和高的方法封裝在一個單一的類中,同時為了避免重復的創建這個類,我們選擇單例模式來實現。我的代碼如下:
單例模式:
/* 單例類*/
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);
}
}
代碼的運行效果:
從上面的圖,我的手機的屏幕寬和高分別為320和480,看來分辨率和屏幕小的可憐了!
好了,到這裡我們基本分析和使用了常用的單例模式。
1、Service概述Service的主要作用是,讓系統可以在後台干一些不與用戶交互的操作,這些操作可能會比較耗時,比如去下載一些網絡資源等;也可能是一項長期運行的工作,
Android 自定義控件實現顯示文字的功能自定義控件—–逐個顯示文字ONE Goal ,ONE Passion !前言:今天要實現的效果時.讓我們的文字一個一個顯示出來
1、傳感器簡介手機中內置的傳感器是一種微型的物理設備,它能夠探測、感受到外界的信號,並按一定規律轉換成我們所需要的信息。Android手機通常都會支持多種類型的傳感器,如
MediaPlayer的狀態轉換圖也表征了它的生命周期,搞清楚這個圖可以幫助我們在使用MediaPlayer時考慮情況更周全,寫出的代碼也更具健壯性。接下來用幾張圖,來慢