使用静态函数impl模式做接口
impl即桥接模式,主要是为了隐藏数据和减少不必要的编译。
普通的impl模式做接口一般是:A类是接口,B类继承A类,是A类的实现,C类,包含A类和B类的头文件,把B类对象指针,转做为基类指针,给使用者。代码示意如下:
// a.hclass A{ // 接口类 纯虚函数 virtual void add();};///// b.h#include "a.h"class B:public A{ // 接口实现类 void add();}///#include "a.h"#include "b.h"class C{ // 给使用者的类 A* GetA(){ return new B(); };}/// c.cpp#include "b.h"#include "c.h" // 类c的实现 A* C::GetA(){ return new B(); };}
但是这样,用了三个类(也有是把第三个类用全局函数或全局对象代替),给使用者至少暴露两个类的头文件A和C;
最近有在看webrtc的音频模块时,看到使用静态函数的方法获取实现类对象,感觉很是精巧,对实现的隐藏性更好,也达到了减少文件暴露,使用者只要包含接口文件即可。
// a.hclass A{ // 接口类 static A* GetA(); // 静态函数,在实现类B的cpp文件实现 virtual void add();};///// b.h#include "a.h"class B:public A{ // 接口实现类 void add();}///// b.cppA* A::GetA(){ return new B();}
调用静态函数getA()就可以获取实现类B的对象,对于使用者,只需要给接口类A的头文件,甚至使用者根本不知道实现类B的存在。