2017-02-10 88 views
1

我有一个类,它有一个静态函数,其中返回该类的一个实例。类中的静态函数返回类的一个实例

我只是想知道如果这是不好的做法使用。

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; 
    } 
} 
+4

nah。事实上,多数民众议会是如何创建的 - 私人构造函数从静态方法调用类 –

+0

这是很好,如果你想控制如何初始化类。但为此,建议将任何构造函数设置为“私有”,以便消费者无法解决这个问题。 –

+2

虽然也很好的提到单身人士经常因为[反模式]而感到讨厌(https://en.wikipedia.org/wiki/Anti-pattern)。示例:[什么是单身人士这么糟糕](http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons) –

回答

6

这是一个工厂方法,所以你应该把它CreateFoo()NewFoo()代替GetFoo(),因为你所选择的名字所暗示的,一个FOO已经存在,你只是回到它。

工厂方法相当于构造函数。在某些情况下,如果继承层次结构中有复杂的构造函数,并且每个构造函数都必须调用基构造函数,并且事情会变得非常复杂,因为构造函数可能只在最初调用超构造函数时才执行任何其他语句计算要传递给基础构造函数的东西。在这些情况下,预先计算工厂方法中需要计算的任何需求有时很有用。

-1

要控制实例创建,可以使用这种方法。将构造函数设置为私有,并定义一个函数以“创建实例”。在这个函数中,您将检查参数是否足以创建实例,如果不是,则返回null,否则返回对象。

-1

编辑:你描述的方法可能是非常有用的(正如其他答案中所述),但是这里的具体例子并不仅仅是构造函数。

这似乎毫无意义,因为它与构造函数完成相同的事情。

如果你想为这个类的不同配置设置多个这些参数,为什么不把FoooInt和FooString当作构造函数参数呢?

+0

,那么构造函数不会阻止某人创建多个实例会更好。 [Singleton](http://csharpindepth.com/Articles/General/Singleton.aspx) –

+0

我会理解,如果该方法返回一个变量重新初始化在类中声明,而不是方法。这种方法如何防止某人为两个实例调用两次GetFoo? – igoldthwaite

+0

那么,你可以改变实现来返回一个已经创建的实例。如果你有一个正在使用的公共构造函数,那么更改实现太迟了 –

0

如果你在做什么真正试图做的是实施辛格尔顿,您将得到更好的服务,审查各种实施方案乔恩斯基特广泛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; 
    } 
} 
} 
+1

问题*不是*问如何创建一个单身。 – Servy

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; } 
} 
+0

'System.TimeSpan'这样做。 –

相关问题