class XFactory {
private XFactory() {}
static void getX() {
if(...)
return new A(new XFactory());
else
return new B(new XFactory());
}
}
class A {
private A() {}
public A(XFactory xf) {}
}
class B {
private B() {}
public A(XFactory xf) {}
}
通过这种方式,我可以确保只有Factory可以创建它所属的类的实例。
这是正确的方法还是有其他替代/好方法?
答案 0 :(得分:2)
常见的方法(在C ++中)是将“所属类”构造函数设为私有,并让它们将工厂类声明为friend
。
答案 1 :(得分:1)
我会创建XFactory的A和B类朋友,并将所有构造函数保密。因此,只有XFactory才能访问其构造函数。
也就是说,在C ++中。在Java或C#中,我没有看到在编译时强制执行的任何干净方法。你的例子远非傻瓜,甚至有点令人困惑,因为只要有一个XFactory实例,他就可以将它传递给A或B的构造函数并直接实例化它们。
答案 2 :(得分:1)
如果你是为了破解并且无法使你的构造函数变得私有,你可以: 使您的工厂成为全局单例并创建对象:
(我得到黑客点吗?) 雅各布
答案 3 :(得分:-1)
在Java中,您可以将构造函数设为私有,并以公共嵌套类的形式提供工厂,因为嵌套类可以访问声明它们的类的私有成员。
public class ExampleClass {
private ExampleClass() {
}
public class NestedFactory {
public ExampleClass createExample() {
return new ExampleClass();
}
}
任何想要创建ExampleClass.NestedFactory实例并通过它实例化ExampleClasses的人。
由于Java编译器要求您为超类指定构造函数,所以我无法找到一种方法可以让您继承ExampleClass ...因此这是一个缺点。