在MP3播放器中,无疑MP3或其他音乐文件的解码就是这里的业务逻辑,而诸如“播放”、“暂停”这些接收用户输入的控件就是数据表现形式。现在目的和明确了,就是将这两这分离。

UI和Player的接口
但程序如何将这两这组装起来那?直接使用CUI和CPlayer?这样的话,在更换UI或者希望能播放wav之类的音乐时,对代码的修改都不符合开放封闭原则。但是加上Factory呢?

加上Factory后的UML图
一切似乎都在改变。如果最开始是用MFC做的一套UI,现在需要将程序移植到Linux上,且用Qt做UI来实现MP3的播放,那么只需要添加CLinuxQtUI类实现IUI接口就可以了,程序的大部分代码不需要改变。假如想支持wma文件的播放,好,只需另外再增加一个类CwmaPlayer来实现IPlayer就完了。
显然这样的工作量减少很多。