我正在编写一个类库,它将提供与USB通信的功能。特别是有三个类别,它们彼此密切合作,提供沟通机制:
UsbHid (模拟USB )UsbHidReport (提供报表编码/解码)UsbHidReportStream (提供读写操作的机制)这些类的实例是在运行时创建的(因为检测到了USB ),为了便于创建它们,我实现了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对象发布于 2013-12-18 23:43:32
如果我真的很了解你
public class UsbHid
{
...
public UsbHid(string str)
{
...
}
// replace virtual with abstract when the property is required
public virtual UsbHidReport report
{
get{
//do whetever you want or return your default value
return MyDefaultReposrt;
}
}
public virtual UsbHidReportStream stream
{
get{
//do whetever you want or return your default value
return MyDefaultReportStream;
}
}
...
}下一次,当您继承UsbHid类时,只需重写属性
发布于 2013-12-19 10:37:19
同时,我对将这么多的创建对象包装成单个构建器对象感到不自在。
而不是什么?多个构建器对象?
Builder模式正是在这里封装复杂的对象创建。如果构造很简单,您只需将其放入对象的构造函数中即可。
如果一个生成器开始变得臃肿,比如说,要组装5+依赖关系,这可能是一个迹象,表明您的对象有太多的责任。然而,这里的情况并非如此,所以我认为Builder只是一个完美的契合。
https://stackoverflow.com/questions/20669634
复制相似问题