繁体   English   中英

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

[英]Differences between static class and instance class with private constructor

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

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

谢谢

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

public class NoPublicConstructor
{
    private NoPublicConstructor()
    {
    }

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

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

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

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

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));

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM