我有一个具有静态函数的类,其中返回类的实例。
我只是想知道这是不好的做法。
public class Foo()
{
public int FooInt {get; private set;}
public string FooString {get; private set;}
public static Foo GetFoo()
{
Foo foo = new Foo();
foo.FooInt = 5;
foo.FooString = "Test";
return foo;
}
}
答案 0 :(得分:6)
这是一种工厂方法,因此您可能应该将其称为CreateFoo()
或NewFoo()
而不是GetFoo()
,因为您选择的名称意味着foo已经存在并且您是回来吧。
工厂方法等同于构造函数。它们在继承层次结构中有复杂构造函数的某些情况下很有用,其中每个构造函数都必须调用基本构造函数,因为构造函数在执行任何其他语句之前只能在一开始就调用超级构造函数,所以事情会变得非常复杂。计算要传递给基础构造函数的东西。在这些情况下,有时需要预先计算工厂方法中需要计算的任何内容。
答案 1 :(得分:2)
执行此操作的唯一原因是,如果您无法在构造函数中指定所需的参数。例如,如果要通过半径或直径定义圆,则构造函数无法区分。
// This class is immutable
public class Circle
{
private Circle(double radius) { this.Radius = radius; }
public static Circle FromRadius(double radius)
{
return new Circle(radius);
}
public static Circle FromDiameter(double diameter)
{
return new Circle(diameter/2);
}
public double Radius {get; private set; }
}
答案 2 :(得分:0)
如果您 想要做的事情是 Singleton ,那么您可以很好地审核Jon Skeet关于各种实施选项的广泛article
TL; DR回答:
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
// Explicit static constructor to tell C# compiler
// not to mark type as beforefieldinit
static Singleton()
{
}
private Singleton()
{
}
public static Singleton Instance
{
get
{
return instance;
}
}
}
答案 3 :(得分:-1)
要控制实例创建,您可以使用这种方式。将构造函数设置为private,并将函数定义为“Create Instance”。在此函数中,您将检查参数是否足以创建实例,如果不是则返回null,否则返回object。
答案 4 :(得分:-1)
编辑:您正在描述的方法非常有用(如其他答案中所述),但您在此处的具体示例除了构造函数之外不会完成任何其他操作。
这似乎毫无意义,因为它完成了与构造函数相同的操作。
如果你想为这个类的不同配置多个这些,为什么不只是作为构造函数参数的FoooInt和FooString?