13

我有一个定义 CallRate 类型的类。我需要通过从文件中读取数据来添加创建类的多个实例的能力。

我向我的类 CallRate 添加了一个静态方法,该方法返回一个List<CallRate>. 一个类可以通过调用自己的构造函数来生成自己的新实例吗?它有效,我只是想知道这是否是正确的做法。

List<CallRates> cr = CallRates.ProcessCallsFile(file);
4

12 回答 12

20

从静态方法中获取自己的对象是非常好的。

例如

其中一个点网库和你做的一样,

XmlReadrer reader = XmlReader.Create(filepathString);
于 2008-11-02T00:21:31.647 回答
5

当然这很好,甚至在某些情况下受到鼓励。有几种处理对象创建的设计模式,其中一些正是您所描述的。

于 2008-11-02T00:24:52.233 回答
3

当我需要检查参数的有效性时,我经常使用这种模式。强烈建议不要从构造函数中抛出异常。从工厂方法来看还不错,或者您可以选择返回 null。

于 2008-11-02T18:28:27.833 回答
2

对我来说似乎很好。在其他语言中,您可能会编写一个函数,但在像 C# 这样的语言中,静态方法扮演了这个角色。

于 2008-11-02T00:25:18.800 回答
1

没关系。您刚刚创建的内容类似于简单的工厂方法。您有一个创建类型的有效实例的静态方法。实际上你的方法甚至不必是静态的,你仍然有一个有效的代码。有一种设计模式(原型)可以从现有对象创建新的有效对象。请参阅http://www.dofactory.com/Patterns/PatternPrototype.aspx上的详细信息。

于 2008-11-02T00:27:03.057 回答
1

当然,对于简单的解析(或类似)场景——我实际上更喜欢工厂方法成为类的一部分。是的 - 它确实打破了SRP,但它实现了KISS - 所以我称之为净胜。对于更大的应用程序,或更复杂的解析例程 - 让它成为一个外部工厂类更有意义。

对于您的特定情况,我可能更喜欢采用 IEnumerable<string> 而不是文件名的方法 - 这仍然会给您解析逻辑,但允许简单的单元测试和“重用”。调用者可以很容易地将文件包装到 IEnumerable 中。

于 2008-11-02T00:29:20.960 回答
1

工厂方法通常是一个好的设计。当我用 C# 编写它们时,我称它们为“新”,这样:

new MyClass()

变成

MyClass.New()

简单地说,它是这样实现的:

class MyClass
{
    public static MyClass New()
    {
        return new MyClass();
    }
}

null大多数情况下,当有关于是否实际创建类或仅返回,或者是否返回MyClass或从它派生的东西的附加条件时,我会这样做。

于 2008-11-02T00:38:09.197 回答
1

我有时使用公共静态方法作为构造函数重载的替代方法。

尤其是在单独依赖参数类型来指示要构建哪种对象的情况下。

于 2008-11-02T00:50:43.787 回答
1

正如上面多次建议的那样,我很喜欢让静态方法返回实例。

@Paul:别忘了勾选上面的评论,你会发现这是最好的答案。

于 2008-11-02T00:55:14.200 回答
1

就像指出“通过调用自己的构造函数之一来生成自身的新实例”

它不是来自构造函数,而是来自静态方法。

于 2008-11-02T02:14:43.527 回答
1

当我需要一个类的即时实现时,我通常使用它。例如

    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;
于 2008-11-02T11:09:30.747 回答
0

这样做是完全可以接受的。当我这样做时,我通常将类的真正构造函数设为私有,以便很清楚构造实例的唯一方法是通过静态方法。

这在“构造”可能并不总是返回新实例的情况下非常有用。例如,您可能希望返回以前缓存的对象。

于 2009-01-14T19:49:17.733 回答