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