代码之家  ›  专栏  ›  技术社区  ›  GurdeepS

具有私有构造函数的静态类和实例类的区别

c#
  •  4
  • GurdeepS  · 技术社区  · 14 年前

    虽然一个静态类只有一个实例,不能被实例化,但是一个带有私有构造函数的类不能被实例化(因为构造函数看不到),所以每次调用这个类时,这是同一个实例?

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

    谢谢

    3 回复  |  直到 14 年前
        1
  •  4
  •   Jesse C. Slicer    14 年前

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

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

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

    编辑: 工厂类这样做的原因之一是能够在将来的版本中分离出责任:虽然您的代码总是调用工厂创建方法,但作者可能会将该类中的所有“胆量”转移到另一个类中,而您的代码不需要知道其区别。调用该类的“(public)构造函数会将其在一定程度上与原始类实现相关联。

        2
  •  1
  •   Anthony Pegram    14 年前

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

    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));
    
        3
  •  0
  •   Andy White    14 年前

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

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

    与纯静态类相比,使用singleton的优点是可以在singleton中使用接口和不同的实现类。您的“singleton”可能会为一组方法公开一个接口,并且您可以在封面下选择要实例化的具体实现类。如果您使用的是纯静态类,那么很难在不影响其他代码的情况下换出完全不同的实现。

    singleton的主要缺点是很难将实现类换成测试类,因为它是在singleton私有方法中控制的,但是有很多方法可以解决这个问题。