确保只有工厂可以创建实例

时间:2009-08-20 03:22:27

标签: oop

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可以创建它所属的类的实例。

这是正确的方法还是有其他替代/好方法?

4 个答案:

答案 0 :(得分:2)

常见的方法(在C ++中)是将“所属类”构造函数设为私有,并让它们将工厂类声明为friend

答案 1 :(得分:1)

我会创建XFactory的A和B类朋友,并将所有构造函数保密。因此,只有XFactory才能访问其构造函数。

也就是说,在C ++中。在Java或C#中,我没有看到在编译时强制执行的任何干净方法。你的例子远非傻瓜,甚至有点令人困惑,因为只要有一个XFactory实例,他就可以将它传递给A或B的构造函数并直接实例化它们。

答案 2 :(得分:1)

如果你是为了破解并且无法使你的构造函数变得私有,你可以: 使您的工厂成为全局单例并创建对象:

  • 创建随机密钥
  • 将该密钥添加到使用中的密钥的工厂对象中的私有列表
  • 将密钥传递给构造函数
  • 让构造函数检索全局工厂对象并调用它来验证密钥。
  • 如果他们的密钥验证失败,请破坏您的程序(调用exit,die,......任何合适的东西)。或者可能通过电子邮件向管理员发送堆栈。这是应该迅速抓住的事情。

(我得到黑客点吗?) 雅各布

答案 3 :(得分:-1)

在Java中,您可以将构造函数设为私有,并以公共嵌套类的形式提供工厂,因为嵌套类可以访问声明它们的类的私有成员。

public class ExampleClass {

    private ExampleClass() {

    }

    public class NestedFactory {
        public ExampleClass createExample() {
            return new ExampleClass();
    }
}

任何想要创建ExampleClass.NestedFactory实例并通过它实例化ExampleClasses的人。

由于Java编译器要求您为超类指定构造函数,所以我无法找到一种方法可以让您继承ExampleClass ...因此这是一个缺点。