跟着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().


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值