2013-07-10 27 views
1

我已经为自己的PC桥架构了一个基本的EEPROM刻录机,使用Teensy ++ 2.0,并且它工作得很好,但是当我期望扩展它的兼容性时,我的代码变得相当黑客。我正在寻找一些适当的设计使这些代码可以扩展的建议。我已经在软件设计模式上上了一堂课,但是它在一段时间之前,我正在画一个空白。基本上,这里的用例:EEPROM刻录机的设计模式

我有几个方法,如ReadByte(),WriteByte(),ProgramByte()(对于需要多字节写序列的FlashROMs来编程),EraseChip(),等等。所以基本上我有一个EEPROM纯虚拟基类,它可以通过具体的类来实现我想支持的每种芯片类型。棘手的部分是确定要生成哪个芯片类型的对象。我目前在Teensy ++串行输入端上使用了一个伪终端前端,这是一个带参数的基本命令行类型接口,用于将类似芯片类型的选项发送给Teensy ++。问题是,是否有设计模式(使用C/C++),如Factory Pattern,需要芯片类型的字符串输入(因为这是我从用户处获得的),并返回一个EEPROM对象的正确的派生类型,而不必手动创建一些大的switch语句或类似的东西,我不得不在创建新的芯片派生类时将新芯片添加到列表中?因此,像:

公共常量EEPROM & GetEEPROM(常量的std :: string & ID)

,如果我将它传递字符串“am29f032b”返回到AM29F032B对象的引用,或者如果我通过它字符串“sst39sf040”它返回一个SST39SF040对象的引用,然后我可以调用前面提到的函数,它可以用于指定的芯片。

该代码将在AVR微控制器上运行,所以我不能拥有任何巨大的OOP开销,但是我使用的特定微控制器确实有相对大量的程序闪存和工作RAM,所以它是不像我想用2kb操作,但我必须记住有限的资源。

回答

0

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

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

1

你在找什么是可插拔工厂。这里有一个good description。这归因于John Vlissides(Gang of Four中的1),并将抽象工厂模式进一步推进了一步。这种模式恰好也是COM的架构基础。

在C++中实现一个常用的方法是维护抽象工厂的静态注册表。在明智地使用一些模板和静态初始化器的情况下,可以将整个产品包装在每个混凝土产品(例如芯片类型)中包含的几行锅炉板上。

静态初始化程序的使用允许从注册表和想要创建产品的代码中完成具体产品的解耦,并且可以将每个实现作为插件来实现。