现在的位置: 首页 > 综合 > 正文

跟着Android学设计模式:工厂方法(Factory method)

2018年02月10日 ⁄ 综合 ⁄ 共 825字 ⁄ 字号 评论关闭

    阅读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().

【上篇】
【下篇】

抱歉!评论已关闭.