C#具有参数变化设计模式的多个构造函数

时间:2012-07-31 19:16:49

标签: c# design-patterns constructor

我正在尝试重构一些代码,这些代码通过不同的参数组合,具体取决于对象所需的配置类型。例如:

public MyWidget(string server, string port)
{
...
}

public MyWidget(string server)
{
...
}

public MyWidget(bool createAThing, 
                string nameOfThingToBeCreated, 
                string server, 
                string port)
{
...
}

public MyWidget(bool createAThing, string nameOfThingToBeCreated)
{
...
}

...等

我不想使用属性,因为它感觉它隐藏了一些可能的依赖关系,例如如果已分配端口属性,则对象可能需要传入服务器。不要挂在示例参数上,这只是我从空中拉出的东西。

我查看了Builder模式,但这并不是我需要的。任何建议都会很棒!

我正在使用.NET 2.0

2 个答案:

答案 0 :(得分:0)

您可以使用配置对象并将其传递给构造函数。 像这样:

public class WidgetOptions
{
    public string Server { get; set; }
    public string Port { get; set; }
    ... 
}

public class MyWidget
{
    public MyWidget(WidgetOptions options)
    {
         Server = options.Server;
         Port = options.Port;
         ...
    }
}

答案 1 :(得分:0)

实际上,如果目的是始终创建一个“有效”对象,使得对象不会处于半配置状态,那么Builder模式是合适的。构建器保存数据点,直到它们全部被分配,然后可以一次创建完全配置的对象。

但听起来你不相信你的开发人员阅读文档知道要配置什么...... 你确实提供了文档,对吧;)

在这种情况下,可能会提供一组构建器,每个构建器仅公开与最终对象所需的“模式”相关的属性。

所以这样的事情(伪代码和弥补,因为你没有提供关于你真正想要建模的任何hinst)

WidgetBuilder
+ whatever properties are common to all widget creation
+ MakeWidget

VectorWidgetBuilder : WidgetBuilder
+ get/set Lines
+ MakeWidget 

BitmapWidgetBuilder : WidgetBuilder
+ get/set Image
+ MakeWidget 

AnimatedWidgetBuilder : WidgetBuilder
+ get/set Images
+ get/set FrameRate
+ MakeWidget 

这种变体的定义是将这些排列定义为各种WidgetOptions,正如道德大师所称的那样,但每个选择的选项都是它自己的类。因此,您可能只有VectorWidgetOptionsBitmapWidgetOptionsAnimatedWidgetOptions公开相关的属性集。