Android Ap開發設計模式第五篇:單件模式 – Android移動開發技術文章_手機開發 Android移動開發教學課程

Singleton Pattern
名稱由來
java 是一門面向對象的語言,android 用的也是java 開發ap ,在java/C#  裡面所有的物體(類)都可以看作是一個對象,而要使用這個對象無外乎為它在內存裡面分配一個對象,一般情況下最直接的方法是new 一個對象,讓它存在於內存中。


  單件/例模式是所有設計模式中可以說是最簡單最易懂的一種編程方式 ,想保證某個特定類的對象實例絕對隻有一個時,想在程序上表達出對象實例隻會有一個時,這種做法就被稱為單件/例模式。


  Singleton 是指隻有1個元素的集合。就是因為它隻會有1 個對象實例,因而得名。


由於其簡單性,在此就不把UML圖畫出來瞭。本篇共涉及兩個類,一個為測試單件/例模式的類,一個為普通類,用來區分單例模式與普通對象的區別。


 


  單件/例 類 Singleton
 


public class Singleton {
    private static  Singleton singleton=new Singleton();
    
    private Singleton(){
       
        System.out.println(“對象己產生”);
    }
    public static  Singleton getInstance(){
        return singleton;
    }
}
 


  該類把singleton 定義為靜態字段,再以Singleton 類的對象實例進行初始化,這個初始化的操作僅在加載Singleton 類時進行一次。


  類的構造函數為私有的,主要是為瞭禁止從非Singleton 類調用構造函數。所以直接使用new Singleton() 會發生編譯的錯誤 。


  單件/例 模式存在的必要隻是為瞭確保對象隻產生一個實例,如果編碼小心該模式一般沒什麼存在的必要,但誰能保證呢?存在即合理。


 


  normal 類是一個空類
 


public class normal {


}
 


 


  android 界面入口測試該 單件/例模式 SingletonPatternActivity 類
 


public class SingletonPatternActivity extends Activity {


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        ((Button) findViewById(R.id.Button01))
                .setOnClickListener(new OnClickListener() {


                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        Singleton obj1=Singleton.getInstance();
                        Singleton obj2=Singleton.getInstance();
                       
                       
                        normal obj3=new normal();
                        normal obj4 =new normal();
                        if(obj1==obj2){
                            ((EditText) findViewById(R.id.EditText01)).setText(“obj1和obj2是同一對象實例”);
                        }
                        else {
                            ((EditText) findViewById(R.id.EditText01)).setText(“obj1和obj2不是同一對象實例”);
                        }
                       
                        if(obj3==obj4){
                            ((EditText) findViewById(R.id.EditText02)).setText(“obj3和obj4是同一對象實例”);
                        }else {
                            ((EditText) findViewById(R.id.EditText02)).setText(“obj3和obj4不是同一對象實例”);
                        }
                       
                    }
                });


    }
}
 


測試結果



 


  該模式經常在編寫 android 應用時,如果應用有使用Application用得比較多,詳細的代碼可以參考jamendo 開源播放器,裡面就有在Application裡面使用單件/例 模式。


 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *