静态类和实例类与私有构造函数之间的差异

时间:2010-04-01 20:50:26

标签: c#

虽然静态类只有一个实例且无法实例化,但是无法实例化具有私有构造函数的类(因为无法看到构造函数),所以每次调用此类时,这都是同一个例子?

工厂类始终遵循最后一个约定(具有私有构造函数的实例类)。这是为什么?

由于

3 个答案:

答案 0 :(得分:4)

没有什么能阻止私有构造函数的类使用公共静态方法返回类的实例:

public class NoPublicConstructor
{
    private NoPublicConstructor()
    {
    }

    public static NoPublicConstructor NewInstance()
    {
        return new NoPublicConstructor();
    }
}

如您所见,静态方法不会返回相同的一个实例。

编辑:工厂类执行此操作的原因之一是能够在将来的版本中分离责任:当您的代码始终调用工厂创建方法时,作者可能会移动所有“胆量”从那个班级到另一个班级,你的代码不需要知道差异。调用该类'(public)构造函数将其绑定到原始类实现的程度。

答案 1 :(得分:1)

你不能*从课外获得一个实例,但你可以从内部获得。静态方法或内部类可以使用私有构造函数创建和返回类的实例。静态类不能由任何实例实现。

class Foo
{
    private Foo()
    {
    }

    public class Bar
    {
        public Bar()
        {
        }

        public Foo GetFoo()
        {
            return new Foo();
        }
    }
}

...

Foo.Bar fooBar = new Foo.Bar();
Foo foo = fooBar.GetFoo();

编辑: *我使用“不能”这个词。 Brian Rasmussen在对OP的评论中指出,获取实例的另一种方法是通过System.Runtime.Serialization.FormatterServices调用,这是类本身的外部。

Foo foo = (Foo)System.Runtime.Serialization.FormatterServices.GetSafeUninitializedObject(typeof(Foo));

答案 2 :(得分:0)

使用私有构造函数创建一个类是实现“Singleton”对象的常用模式。

Singleton通常会实例化自身的实例,并且只允许通过静态“Instance”属性访问它,这意味着只有一个类的实例。

在纯静态类上使用Singleton的优点是可以在单例中使用接口和不同的实现类。您的“Singleton”可能会为一组方法公开一个接口,您可以选择要在底层实例化的确切实现类。如果您使用的是纯静态类,则很难换出完全不同的实现,而不会影响其他代码。

Singleton的主要缺点是很难换出实现类进行测试,因为它是在Singleton私有方法中控制的,但是有办法解决这个问题。