【问题标题】:Methods for complex runtime object creation复杂运行时对象创建方法
【发布时间】:2013-12-18 22:19:04
【问题描述】:

我正在编写一个类库,它将提供与 USB HID 通信的功能。尤其是三个类,它们相互密切合作以提供通信机制:

  • UsbHid(模拟 USB HID)
  • UsbHidReport(提供报告编码/解码)
  • UsbHidReportStream(提供读/写操作的机制)

这些类的实例是在运行时创建的(当检测到感兴趣的 USB HID 时),为了方便它们的创建,我实现了 abstract factory 模式。这部分我相当满意。

我的问题是我如何巧妙地管理最终 UsbHid 的构造,它依赖于 UsbHidReportUsbHidReportStream

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 将提供所需的参数。它将构造UsbHidReportUsbHidReportStream 的实例,用于创建UsbHid 对象,随后将返回client

虽然我有点喜欢将对象创建的实现从client 隐藏起来的概念,但同时我对将这么多对象创建包装到单个builder 对象中感到不安。

我意识到软件绝不是简单的黑或白,一切都有优点和缺点。也就是说,我正在让自己陷入沉思,所以想知道其他人认为更合适的解决方案是什么。

  • 允许client 实现对象创建
  • 使用builder 对象
  • 其他?

【问题讨论】:

  • 为什么不让工厂创建 UsbHid 并让 UsbHid 创建 UsbHidReportUsbHidReportStream?你真的需要工厂吗?工厂的关键在于它们赋予客户端创建对象的能力。
  • @Euphoric - 这似乎打破了关注点分离原则,因为UsbHid 不应该关心如何创建它的依赖项,只需使用它们。工厂确实为client 提供了创建对象的能力,具体实现由工厂而不是client 决定。
  • 它们真的是依赖关系吗?例如,您是否可以使用完全不同的 usbStream 和具有相同参数的 usbReport 创建 usbHid?
  • @Euphoric - 抱歉,我不太明白这个问题。

标签: c# design-patterns builder


【解决方案1】:

如果我理解你的话

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 类时,只需覆盖属性

【讨论】:

    【解决方案2】:

    同时我对包裹这么多物品感到不安 创建到单个构建器对象中

    相对于什么?多个构建器对象?

    Builder 模式正是在这里封装复杂的对象创建。如果构造简单,您只需将其放入对象的构造函数中即可。

    如果一个 Builder 开始变得臃肿,需要组装 5 个以上的依赖项,这可能表明您的对象有太多责任。但是这里不是这样,所以我认为 Builder 非常适合。

    【讨论】:

    • 我以前从未使用过builder 模式,只是在研究"complex" 对象创建方法时才发现它。我的不安是因为不确定它是否适合我的场景,或者我是否正在实施与它增加的“复杂性”相比几乎没有优势的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多