【发布时间】:2013-12-18 22:19:04
【问题描述】:
我正在编写一个类库,它将提供与 USB HID 通信的功能。尤其是三个类,它们相互密切合作以提供通信机制:
-
UsbHid(模拟 USB HID) -
UsbHidReport(提供报告编码/解码) -
UsbHidReportStream(提供读/写操作的机制)
这些类的实例是在运行时创建的(当检测到感兴趣的 USB HID 时),为了方便它们的创建,我实现了 abstract factory 模式。这部分我相当满意。
我的问题是我如何巧妙地管理最终 UsbHid 的构造,它依赖于 UsbHidReport 和 UsbHidReportStream。
public class UsbHid(string str, UsbHidReport report, UsbHidReportStream stream)
理想情况下,我希望尽可能多地从client 中删除创建过程,这意味着它们会向我的库提供所需的信息,然后我使用这些信息来确定要返回的内容。
例如:
宁愿避免
var usbStream = streamFactory.Create(parameters);
var usbReport = reportFactory.Create(parameters);
var usbHid = hidFactory.Create(parameters, usbReport, usbStream);
更喜欢
var usbHid = creationalObject.GetHid(parameters);
所以我正在考虑使用builder 模式,client 将提供所需的参数。它将构造UsbHidReport 和UsbHidReportStream 的实例,用于创建UsbHid 对象,随后将返回client。
虽然我有点喜欢将对象创建的实现从client 隐藏起来的概念,但同时我对将这么多对象创建包装到单个builder 对象中感到不安。
我意识到软件绝不是简单的黑或白,一切都有优点和缺点。也就是说,我正在让自己陷入沉思,所以想知道其他人认为更合适的解决方案是什么。
- 允许
client实现对象创建 - 使用
builder对象 - 其他?
【问题讨论】:
-
为什么不让工厂创建 UsbHid 并让
UsbHid创建UsbHidReport和UsbHidReportStream?你真的需要工厂吗?工厂的关键在于它们赋予客户端创建对象的能力。 -
@Euphoric - 这似乎打破了关注点分离原则,因为
UsbHid不应该关心如何创建它的依赖项,只需使用它们。工厂确实为client提供了创建对象的能力,具体实现由工厂而不是client决定。 -
它们真的是依赖关系吗?例如,您是否可以使用完全不同的 usbStream 和具有相同参数的 usbReport 创建 usbHid?
-
@Euphoric - 抱歉,我不太明白这个问题。
标签: c# design-patterns builder