虽然静态类只有一个实例且无法实例化,但是无法实例化具有私有构造函数的类(因为无法看到构造函数),所以每次调用此类时,这都是同一个例子?
工厂类始终遵循最后一个约定(具有私有构造函数的实例类)。这是为什么?
由于
答案 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私有方法中控制的,但是有办法解决这个问题。