我有一个定义了CallRate类型的类。我需要通过从文件中读取数据来添加创建多个类实例的能力。
我向CallRate类中添加了一个静态方法,该方法返回一个List<CallRate>
。一个类通过调用自己的构造函数来生成新实例是否可以?它可以工作,但我想知道这是否是正确的做法。
List<CallRates> cr = CallRates.ProcessCallsFile(file);
我有一个定义了CallRate类型的类。我需要通过从文件中读取数据来添加创建多个类实例的能力。
我向CallRate类中添加了一个静态方法,该方法返回一个List<CallRate>
。一个类通过调用自己的构造函数来生成新实例是否可以?它可以工作,但我想知道这是否是正确的做法。
List<CallRates> cr = CallRates.ProcessCallsFile(file);
从静态方法中获取其自身的对象是完全可以的。
例如:
其中一个.NET库做了与您所做的相同的事情。
XmlReadrer reader = XmlReader.Create(filepathString);
当我需要检查参数的有效性时,我经常使用这种模式。强烈不建议从构造函数中抛出异常。从工厂方法中抛出也不是很糟糕,或者您可以选择返回null。
对我来说看起来很好。在其他语言中,您可能会编写一个函数,但在像C#这样的语言中,静态方法承担了该角色。
工厂方法通常是一个很好的设计。当我在C#中编写它们时,我称之为“New”,这样做的原因是:
new MyClass()
变成
MyClass.New()
这个实现非常简单:
class MyClass
{
public static MyClass New()
{
return new MyClass();
}
}
通常情况下,我这样做是因为有其他条件来判断是否要创建类或者只是返回null
,或者是返回MyClass
或者它的派生类。
通常我在需要一个类的即时实现时使用它。例如
public class Car
{
public static Car RedExpensiveCar = new Car("Red", 250000);
public Car()
{
}
public Car(string color, int price)
{
Color = color;
Price = price;
}
public string Color { get; set; }
public int Price { get; set; }
}
有了这个,我就不需要在代码中记住或写构造函数参数了。
Car car = Car.RedExpensiveCar;
没问题。你刚刚创建的东西有点像一个简单的工厂方法。你有一个静态方法来创建一个有效的类型实例。实际上,你的方法甚至不需要是静态的,你仍然有一个有效的代码。有一种设计模式(原型)可以从现有对象创建一个新的有效对象。详见http://www.dofactory.com/Patterns/PatternPrototype.aspx。
有时我会使用公共静态方法作为构造函数重载的替代方案。
特别是在不依赖参数类型来指示所需对象构造类型的情况下。
我喜欢使用静态方法返回实例,正如上面多次建议的那样。
@Paul:不要忘记勾选上面的评论,你会发现它是最佳答案。