首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于复杂运行时对象创建的方法

用于复杂运行时对象创建的方法
EN

Stack Overflow用户
提问于 2013-12-18 22:19:04
回答 2查看 104关注 0票数 0

我正在编写一个类库,它将提供与USB通信的功能。特别是有三个类别,它们彼此密切合作,提供沟通机制:

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

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

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

代码语言:javascript
复制
public class UsbHid(string str, UsbHidReport report, UsbHidReportStream stream)

理想情况下,我希望尽可能多地从client中删除创建过程,这意味着它们向我的库提供了所需的信息,然后我使用这些信息来确定返回的内容。

例如:

宁愿避免

代码语言:javascript
复制
var usbStream = streamFactory.Create(parameters);
var usbReport = reportFactory.Create(parameters);
var usbHid = hidFactory.Create(parameters, usbReport, usbStream);

更喜欢

代码语言:javascript
复制
var usbHid = creationalObject.GetHid(parameters);

因此,我正在考虑使用builder模式,client将向该模式提供所需的参数。它将构造UsbHidReportUsbHidReportStream的实例,以便用于创建一个UsbHid对象,然后返回到client

虽然我有点喜欢将对象创建的实现隐藏在client中的概念,但同时我对将大量的对象创建封装为单个builder对象感到不安。

我意识到软件从来都不是简单的黑白分明的,任何东西都有正反两方面的。尽管如此,我也在自作主张地思考这个问题,所以我想知道其他人认为什么才是更合适的解决方案。

  • 允许client实现对象创建
  • 使用builder对象
  • 另一个?
EN

回答 2

Stack Overflow用户

发布于 2013-12-18 23:43:32

如果我真的很了解你

代码语言:javascript
复制
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类时,只需重写属性

票数 0
EN

Stack Overflow用户

发布于 2013-12-19 10:37:19

同时,我对将这么多的创建对象包装成单个构建器对象感到不自在。

而不是什么?多个构建器对象?

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

如果一个生成器开始变得臃肿,比如说,要组装5+依赖关系,这可能是一个迹象,表明您的对象有太多的责任。然而,这里的情况并非如此,所以我认为Builder只是一个完美的契合。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20669634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档