3 回答
TA贡献1735条经验 获得超5个赞
这是与您的第三种方法非常相似的东西:将工厂声明为的内部类T,以及 makeT的构造函数private:
public class T {
public class Factory {
public T GetT() {
return new T(); // simple implementation just for an example here
}
}
private T() {}
}
由于Factory是 inside T,它可以访问私有构造函数,但外部代码不能。如果您不想创建单独的程序集,可以考虑这种方法。
请注意,您仍然可以将工厂类和放在T两个不同的文件中,其中包含partial类:
public partial class T {
private T() {}
// other stuff about T here...
}
// in another file
public partial class T {
public class Factory {
public T GetT() {
return new T();
}
// other stuff about Factory here...
}
}
TA贡献1757条经验 获得超8个赞
public abstract class T { }
public class TFactory
{
public T CreateT() => new TImpl();
private class TImpl : T { }
}
TA贡献1906条经验 获得超3个赞
第二种方法是最糟糕的。这种行为对客户来说是绝对不明显和不清楚的。堆栈跟踪还会减慢执行速度。第一个和第二个是有道理的。
如果您想完全控制实例创建,请将其放入类型中。使用工厂方法。请记住,在对实例创建施加约束时应该是合理的。例如,实例应该使用多态(虚拟)方法启动。不能从构造函数中调用这样的方法(一种非常糟糕的做法),因此应该在构造之后调用该方法。为了不把这个责任推给客户,隐藏一个构造函数并提供一个工厂方法。
abstract class Base
{
protected abstract void Initialize();
}
class Derived : Base
{
protected Derived() { /* ... */}
protected override void Initialize() { /* ... */}
public Derived CreateDerived()
{
var derived = new Derived();
derived.Initialize();
return derived;
}
}
- 3 回答
- 0 关注
- 113 浏览
添加回答
举报