我使用Teensy ++ 2.0为我的PC桥构建了一个基本的EEPROM刻录机,它工作得很好,但是当我想扩展它的兼容性时,我的代码变得相当hacky。我正在寻找一些适当设计的建议,以使这个代码可扩展。我参加了一个软件设计模式的课程,但它是在一段时间之前,我现在正在画一个空白。基本上,这是用例:
我有几种方法,例如ReadByte(),WriteByte(),ProgramByte()(对于需要多字节写序列以便编程的FlashROM),EraseChip()等等,所以基本上我有一个EEPROM纯虚拟基类,由我想支持的每种芯片类型的具体类实现。棘手的部分是确定要生成哪种芯片类型对象。我目前在Teensy ++串行输入上使用伪终端前端,这是一个带参数的基本命令行类型接口,用于向Teensy ++发送芯片类型等选项。问题是,是否存在一种设计模式(在C / C ++中),类似于工厂模式,它将采用芯片类型的字符串输入(因为这是我从用户那里得到的),并返回一个EEPROM对象正确的派生类型,而不必手动创建一些大的switch语句或丑陋的东西,我必须在创建新的芯片派生类的任何时候将新芯片添加到列表?如下所示:
public const EEPROM& GetEEPROM(const std :: string& id)
如果我将字符串“am29f032b”传递给它,它返回对AM29F032B对象的引用,或者如果我将字符串“sst39sf040”传递给它,它将返回对SST39SF040对象的引用,然后我可以调用前面提到的函数on,它适用于指定的芯片。
这段代码将在AVR微控制器上运行,所以我不能有任何大量的OOP开销,但我使用的特定微控制器确实有相对大量的程序闪存和工作RAM,所以它不是就像我试图以2kb运行一样,但我必须记住有限的资源。
答案 0 :(得分:2)
您正在寻找的是 Pluggable Factory 。这里有一个good description。它归功于John Vlissides(Gang of Four中的1个),并将抽象工厂模式进一步推进。这种模式恰好也是COM的架构基础。
在C ++中实现一个的常用方法是维护抽象工厂的静态注册表。通过巧妙地使用一些模板和静态初始化器,您可以将整个批次包装在每个具体产品中包含的几行锅炉板(例如芯片类型)。
静态初始化程序的使用允许将混凝土产品与注册表和想要创建产品的代码完全分离,并且可以将每个产品实现为插件。
答案 1 :(得分:0)
您可以拥有一个单件工厂管理器,用于保存string->工厂对象的地图。然后每个工厂类都有一个全局实例,它在启动时向管理器注册。
我试图避免一般的全局变量,特别是单身人士,但任何其他方法都需要某种形式的明确列表,你试图避免。你必须小心时间问题(你不能真正假设各种工厂的创建顺序。)