1

我为我的 PC 桥接器使用 Teensy++ 2.0 为自己构建了一个基本的 EEPROM 刻录机,它工作得很好,但是当我希望扩展它的兼容性时,我的代码变得相当 hacky。我正在寻找一些建议,以使此代码可扩展的适当设计。我上过一门软件设计模式的课程,但那是不久前的事了,我目前还处于空白状态。基本上,这是用例:

我有几种方法,例如 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 运行,但我必须牢记有限的资源。

4

2 回答 2

2

您正在寻找的是Pluggable Factory。这里有一个很好的描述。它归功于 John Vlissides(四人帮中的一员),并将抽象工厂模式更进一步。这种模式恰好也是 COM 的架构基础。

在 C++ 中实现一个的常用方法是维护抽象工厂的静态注册表。通过明智地使用一些模板和静态初始化程序,您可以将所有内容封装在几行样板中,这些样板将包含在每个具体产品(例如芯片类型)中。

静态初始化器的使用允许将具体产品与注册表和想要创建产品的代码完全分离,并且有可能将每个产品实现为插件。

于 2013-07-10T22:10:50.817 回答
0

你可以有一个单独的工厂管理器来保存字符串->工厂对象的映射。然后每个工厂类都会有一个全局实例,它在启动时向管理器注册自己。

我一般尽量避免使用全局变量,特别是单例变量,但任何其他方法都需要某种形式的显式列表,而您试图避免这种列表。您必须小心时间问题(您不能真正假设任何关于创建各种工厂的顺序)。

于 2013-07-10T21:58:07.587 回答