跟着Android學設計模式:工廠方法(Factory method)

    閱讀Android的優秀源碼,能夠提高自己的設計能力和編程能力,代碼中所運用的設計模式更是讓我歎爲觀止。在閱讀源碼的過程中,我將把自己所見識到的設計模式記錄下來,以便日後參考。

   本文章記錄的是工廠方法。工廠方法定義了一個用於創建對象的接口,讓子類決定實例化哪一個類,它使一個類的實例化延遲到其子類。

   以下是Android中MediaPlayerService部分的源碼。當用戶想播放一個音樂文件或者視頻文件的時候,需要根據文件的類型創建對應的播放器。爲此Android爲播放器設計了一個抽象的基類,同時採用工廠方法來創建這個播放器。MediaPlayerBase就作爲了IFactory的product。MediaPlayerFactory類中保存了註冊的IFactory和它所對應的id。這樣就可以通過一個id找到對應的IFactory來創建MediaPlayerBase。

    那麼MediaPlayerFactory又如何知道該調用哪一個IFactory來創建MediaPlayerBase呢?每一個IFactory中都有一些列的重載函數scoreFactory(……)用於匹配文件和自己支持的播放器的匹配程度。這個函數稱之爲探測函數。匹配度高的IFactory將用於創建MediaPlayerBase。

     在此框架下,如果我們需要擴展自定義的播放器的實現,那麼就只需要定義我們自己的類繼承於MediaPlayerInterface,然後定義具體的工廠類來創建我們自己的播放器類。同時把工廠類註冊到MediaPlayerFactory中。

    下面是UML圖:


    從圖中可以看出抽象基類IFactory中含有工廠方法createPlayer(……)用於創建一個MediaPlayerBase。具體的工廠方法類StagefrightPlayerFactory實現createPlayer()和探測函數scoreFactory().


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章