非静态类工厂方法 - C#

时间:2015-08-13 15:58:50

标签: c#

我把它放在一起解析一个字符串然后在SQL存储过程中返回3个值(我有另一个C#方法根据你选择的输出格式格式化3个值,但是这个代码没有问题所以我没有发布它)。当我的老板看到我的代码时,他说:

  

“你如何拥有非静态类工厂方法?你需要创建   一个解析字符串以创建要使用的对象的对象?

     

为什么要将解析移到课堂中而不是将其留在原来的位置   并只是传回新类来保存数据?“

我做了一个新课程,但我可以轻松地将其移到另一个课程中。问题是我不知道他的非静态工厂方法是什么意思,而且我不知道如何分配Value,Fraction和Direction而不像我那样创建一个新的TwpRng实例 :TwpRng result = new TwpRng();

这是我在c#BTW的第一次破解。

public class TwpRng
{
public string Value;
public string Fraction;
public string Direction;


public TwpRng GetValues(string input)
{
    TwpRng result = new TwpRng();
    result.Value = "";
    result.Fraction = "";
    result.Direction = "";

    Regex pattern_1 = new Regex(@"(?i)^\s*(?<val>\d{1,3})(?<frac>[01235AU])(?<dir>[NEWS])\s*$");    // Example:  0255N
    Match match_1 = pattern_1.Match(input);

    Regex pattern_2 = new Regex(@"(?i)^\s*(?<val>\d{1,3})(?<dir>[NEWS])\s*$");    // Example:  25N
    Match match_2 = pattern_1.Match(input);

    Regex pattern_3 = new Regex(@"(?i)^\s*(?<val>\d{1,3})(?<frac>[01235AU])\s*$");    // Example:  25A
    Match match_3 = pattern_1.Match(input);

    if (match_1.Success)
    {
        result.Value = match_1.Groups["val"].Value;
        result.Fraction = match_1.Groups["frac"].Value;
        result.Direction = match_1.Groups["dir"].Value.ToUpper();             
    }
    else if (match_2.Success)
    {
        result.Value = match_2.Groups["val"].Value;
        result.Direction = match_2.Groups["dir"].Value.ToUpper();
    }
    else if (match_3.Success)
    {
        result.Value = match_3.Groups["val"].Value;
        result.Fraction = match_1.Groups["frac"].Value;
    }
    else
    {
        result = null;
    }
    return result;
}

}

2 个答案:

答案 0 :(得分:1)

  

您如何拥有非静态类工厂方法?您需要创建一个对象来解析字符串以创建要使用的对象吗?

他的意思是,目前为了解析输入,您需要这样做:

var twpRng = new TwpRng(); // Doesn't really make sense to instantiate an empty object
twpRng = twpRng.GetValues(input); // just to create another one.

如果您使用工厂方法GetValues static

public static TwpRng GetValues(string input)

您可以更轻松地解析:

var twpRng = TwpRng.GetValues(input);

答案 1 :(得分:0)

如果你改变:

public TwpRng GetValues(string input)

为:

public static TwpRng GetValues(string input)

您已从非静态工厂模式更改为静态工厂模式。两者的调用顺序如下:

TwpRng myRng = new TwpRng();
TwpRng createdRng = myRng.GetValues(input);

而不是:

TwpRng createdRng = TwpRng.GetValues(input);

其余代码可以是相同的。

扩展说明

老板问的是使用静态修饰符。静态方法可以在不首先实例化(创建实例)类的情况下调用,并且通常用于解析数据并返回类的完全水合的实例。静态方法也可以用于实用程序类和方法(实例化对象可能过度杀伤),并且您只想对一组功能进行分组。