Гарантируя, что только фабрика может создать экземпляр - PullRequest
1 голос
/ 20 августа 2009
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 ]

2 голосов
/ 20 августа 2009

Общий подход (в C ++) состоит в том, чтобы сделать конструкторы «принадлежащих классов» частными и заставить их объявить класс фабрики как friend.

1 голос
/ 20 августа 2009

Если вы были за хаки и не могли сделать ваши конструкторы приватными, вы могли бы: Сделайте свою фабрику глобальным синглтоном и создайте объект:

  • Создать случайный ключ
  • Добавить этот ключ в личный список на заводском объекте используемых ключей
  • Передать ключ конструктору
  • Пусть конструктор извлечет объект глобальной фабрики и вызовет его для проверки ключа.
  • Если проверка ключей завершится неудачно, закройте вашу программу (вызовите exit, die, ... что угодно) Или, возможно, по электронной почте стека тракта для администратора. Это та вещь, которую нужно поймать быстро.

(Могу ли я получить очки взлома?) Jacob

1 голос
/ 20 августа 2009

Я бы подружился с классами A и B в XFactory и оставил бы все их конструкторы закрытыми. Поэтому только XFactory имеет доступ к своим конструкторам.

То есть в C ++. В Java или C # я не вижу какого-либо чистого способа применения этого во время компиляции. Ваш пример далеко не надежен и даже немного сбивает с толку, поскольку, если у вас есть экземпляр XFactory, он может передавать его конструктору A или B и создавать их экземпляры напрямую, вот так.

0 голосов
/ 20 августа 2009

В Java вы можете сделать конструкторы частными и предоставить фабрику в форме открытого вложенного класса, поскольку вложенные классы имеют доступ к закрытым членам класса, в котором они объявлены.

public class ExampleClass {

    private ExampleClass() {

    }

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

Любой, кто хотел, мог создать экземпляр ExampleClass.NestedFactory и с его помощью создать экземпляр ExampleClasses.

Я не смог найти способ сделать это, который позволил бы вам потом наследовать от ExampleClass, поскольку компилятор Java требует, чтобы вы указали конструктор для суперкласса ... так что это недостаток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...