Почему некоторые классы ограничивают прямую реализацию? - PullRequest
1 голос
/ 23 января 2010

Я сталкивался с различными классами, которые не позволяют создавать их экземпляры напрямую. Скорее мы должны создать их экземпляр из статического метода некоторого другого класса или его собственного статического метода. Например:

B b = A.getB();

или

B b = B.getInstance();

Какая причина этого стоит?

Почему они не позволяют создавать экземпляры напрямую, как в:

B b = new B();

Ответы [ 5 ]

7 голосов
/ 23 января 2010

Некоторые классы хотят контролировать способ их создания и таким образом защищать свои конструкторы от публичного использования. Использование статических фабричных методов, таких как getInstance, позволяет им сохранять этот элемент управления в своем собственном коде.

Есть миллион причин для этого.

edit : Чтобы обратиться к вашему комментарию, это не может быть сделано внутри конструктора, потому что оператор new всегда создаст новый экземпляр (если не выдается исключение). К тому времени, когда вызывается конструктор, уже слишком поздно для кода в конструкторе контролировать, создан ли объект.

4 голосов
/ 23 января 2010

Это пример Singleton Pattern . У них обычно есть приватный метод конструктора, но в приведенном мною примере они использовали protected для предотвращения создания экземпляров.

Абстрактные классы тоже не смогут быть созданы.

1 голос
/ 23 января 2010

Некоторые варианты использования:

  1. С шаблоном Фабрика будет виден только интерфейс Объекта, сама реализация может быть выбрана и изменена Фабрикой.
  2. Метод createInstance выполняет некоторую дополнительную работу за кулисами, которую нельзя выполнить в ctor
  3. Класс может использовать Singleton для этого объекта и всегда возвращает один и тот же экземпляр
1 голос
/ 23 января 2010

Оба являются реализациями шаблонов создания , то есть шаблонами , которые имеют дело с механизмами создания объектов, пытаясь создать объекты способом, подходящим для ситуации .

  • Первый пример выглядит как Шаблон метода фабрики : определите интерфейс для создания объекта, но пусть подклассы решают, какой класс создать. Factory Method позволяет классу откладывать создание экземпляров для подклассов [Gof].

  • Второй пример - шаблон Singleton : фабрика, которая может создавать только один экземпляр класса.

Они не позволяют создавать экземпляр напрямую с помощью new, поскольку они точно нацелены на управление тем, как выполняется создание для решения конкретной проблемы: ограничение создания экземпляра класса одним объектом для singleton, позволяя подклассам решать, какой класс создавать для фабрики.

1 голос
/ 23 января 2010

Когда объекты имеют сложную логику создания, конструктор делегирует создание объекта конкретным объектам Это соответствует принципу единственной ответственности : цель состоит в том, чтобы позволить объекту игнорировать структуры и процедуры, необходимые для его создания.

Без использования Фабрики создание сложных объектов потребовало бы длинных конструкторов со слишком большим количеством параметров.

В случае getInstance() разработчик хотел, чтобы в его приложении был доступен один экземпляр объекта: это Singleton pattern , и это эквивалент глобальной переменной.

...