项目中涉及到特征拼接的部分代码, 考虑到封装接口+动态绑定的实现方案, 故我们需要的是一个自动注册的模板工厂。

具体用到了: 工厂模式、生成器模式、单例模式、模板模式…

 

首先我们看看模板化的实现:CommonFactory.h

 

然后接下来我们定义简单的消息类型, 使用并理解CommonFactory。

创建Message文件夹,定义消息接口,它有纯虚函数可以获取具体的消息:

我们定义了消息接口、消息工厂、消息生成器以及一个用于注册消息的宏。

 

接下来在Message文件夹内创建两个具体的消息, 分别叫HelloMessage 和 HiMessage,  完成后文件路径如下:

P.s> 这里CommonFactory放哪里都可以, 我在实际项目中放的地方也不同。

 

HelloMessage.h 内容如下:

HelloMessage.cpp

 

HiMessage.h

 

HiMessage.cpp

 

main.cpp

CMakeLists.txt 就不展示了, 是CMake编译用的。

 

然后main文件在Test文件夹, 很明显会编译Message和 Test两个文件夹,然后让Test去链接Message。(这里有坑, 后文继续解决)

但是当我们编译结束之后, 运行会发现结果如下:

 

这里的原因是: 链接静态库时,链接器会检查静态库的变量和函数是否被使用,没有使用的不会链接。

所以我们要想办法让Test去链接Message静态库,  解决方案在stackoverflow上面已经有了。

https://stackoverflow.com/questions/14116420/how-to-force-gcc-to-link-an-unused-static-library

User should anyway add -Wl,-no-whole-archive at the end. As man ld says: “Second, don’t forget to use -Wl,-no-whole-archive after your list of archives, because gcc will add its own list of archives to your link and you may not want this flag to affect those as well.” – Sasha

 

旧的CMakeLists.txt :

 

修改Test的CMakeLists.txt文件如下:

 

重新编译, 运行输出结果如下:

 

完成!

P.s> 我们还可以在定义一个Name的工厂,通过配置组合Hello/Hi, Name1/Name2得到他们的组合。

 

参考文档:

https://www.cnblogs.com/qicosmos/p/5090159.html

基于它的方案, 改进后, main函数只需要include接口即可,在工程上编译效率大大提高。

【设计模式】自动注册模板工厂…Emmm
Tagged on:
0 0 投票数
Article Rating
订阅评论
提醒

0 评论
内联反馈
查看所有评论