我已经使用Teensy++ 2.0为我的PC桥建立了一个基本的EEPROM刻录机,它工作得很好,但当我寻求扩展它的兼容性时,我的代码变得相当粗糙。我正在寻找一些适当的设计,使此代码可扩展的一些建议。我上过一门关于软件设计模式的课程,但那是一段时间以前的事了,我现在一片空白。基本上,这是一个用例:
我有几个方法,比如ReadByte(),WriteByte(),ProgramByte() (对于需要多字节写序列才能编程的FlashROM),EraseChip()等等,所以基本上我有一个EEPROM纯虚拟基类,它是由我想支持的每种芯片类型的具体类实现的。棘手的部分是确定生成哪种芯片类型的对象。我目前在Teensy++串行输入上使用了一个伪终端前端,这是一个带参数的基本命令行类型接口,用于向Teensy++发送芯片类型等选项。问题是,有没有一种设计模式(在C/C++中),类似于工厂模式,它可以接受芯片类型的字符串输入(因为这就是我从用户那里得到的),并返回正确派生类型的EEPROM对象,而不必手动创建一些大的switch语句或一些丑陋的东西,每当我创建一个新的芯片派生类时,就必须将新芯片添加到列表中?所以就像这样:
公共常量EEPROM &GetEEPROM(常量std::string & id)
如果我向它传递字符串" AM29F032B“,它将返回对AM29F032B对象的引用,或者如果我向它传递字符串" SST39SF040”,它将返回对SST39SF040对象的引用,然后我可以在该对象上调用前面提到的函数,它将适用于指定的芯片。
这段代码将在AVR微控制器上运行,所以我不能有任何具有巨大OOP开销的东西,但我使用的特定微控制器确实有相对大量的程序闪存和工作RAM,所以我并不是试图在2kb内操作,但我确实必须记住有限的资源。
发布于 2013-07-11 06:10:51
你要找的是一个可插拔的工厂。这里有一个good description。它归功于John Vlisside(Gang of Four中的一员),并将抽象工厂模式又向前推进了几步。此模式恰好也是COM的体系结构基础。
在C++中实现抽象工厂的通常方法是维护抽象工厂的静态注册表。通过明智地使用一些模板和静态初始化器,您可以将所有内容包装成包含在每个具体产品中的几行样板(例如,芯片类型)。
静态初始化器的使用允许将具体产品与注册中心和想要创建产品的代码完全解耦,并有可能将每个产品实现为插件。
发布于 2013-07-11 05:58:08
你可以有一个单独的工厂管理器,它保存了一个字符串->工厂对象的映射。然后,每个工厂类将拥有一个全局实例,该实例在启动时向管理器注册自身。
一般来说,我尽量避免使用全局变量,尤其是单例变量,但任何其他方法都需要某种形式的显式列表,而这正是您试图避免的。您必须小心处理时间问题(您不能真正假设创建各种工厂的顺序)。
https://stackoverflow.com/questions/17581334
复制相似问题