.NET旧版本中如何确保实现类具备私有构造函数与静态工厂方法?
需求与现有方案问题
我需要一个简洁安全的方案来编写接口或抽象类,确保其实现类满足以下要求:
- 拥有私有构造函数
- 提供公开静态工厂方法
- 场景不支持默认接口实现
- 工厂方法的返回类型不能被窄化为接口或抽象类型
最小化工厂方法示例
public class ClassWithFactoryMethod { private ClassWithFactoryMethod() { /* ... */ } public static ClassWithFactoryMethod CreateInstance() => new ClassWithFactoryMethod(); }
已尝试的方案及问题
使用接口的方案限制
若通过接口强制CreateInstance方法存在,会遇到以下问题:
- 无法确保实现类的构造函数为私有,也无法约束
CreateInstance是公开静态方法——接口方法不支持静态修饰,也不能指定访问权限 CreateInstance的实现必须返回接口类型实例,而非实现类自身的实例CreateInstance无法定义为静态方法,因此接口无法保证类可通过公开静态工厂方法构造
对应的代码示例:
public interface IClassWithFactoryMethod { IClassWithFactoryMethod CreateInstance(); } public class ClassWithFactoryMethod: IClassWithFactoryMethod { private ClassWithFactoryMethod() { /* ... */ } public IClassWithFactoryMethod CreateInstance() => new ClassWithFactoryMethod(); }
使用抽象类的方案限制
抽象类对访问权限的控制略强,但仍存在类似的类型窄化问题:
- 即便抽象类声明了受保护的构造函数,实现类的构造函数仍可能设置为更高的访问权限
- 可以通过抽象类声明公开的
CreateInstance来确保其公开性(实现类无法修改访问权限),但可重写方法在基类和实现类中都不能设为静态 - 由于无法预知实现类的具体类型,
CreateInstance必须返回抽象类类型的实例,和接口方案面临同样的类型窄化问题 - 重写的工厂方法无法设为静态,因此抽象类也无法确保实现类存在公开静态工厂方法
对应的代码示例:
public abstract class ClassWithFactoryMethodBase { protected ClassWithFactoryMethodBase() { } public abstract ClassWithFactoryMethodBase CreateInstance(); } public class ClassWithFactoryMethod : ClassWithFactoryMethodBase { private ClassWithFactoryMethod() { /* ... */ } public override ClassWithFactoryMethodBase CreateInstance() => new ClassWithFactoryMethod(); }
以上两种方案都无法确保工厂方法是公开且静态的,即便能满足访问权限要求,也会将工厂方法的返回类型窄化为不可实例化的接口或抽象类类型。
内容的提问来源于stack exchange,提问作者Josh Brunton
相关产品推荐
相关产品推荐

