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

StackOverflow https://stackoverflow.com/questions/2124222

Вопрос

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

B b = A.getB();

или

B b = B.getInstance();

Какая причина кроется за этим?

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

B b = new B();
Это было полезно?

Решение

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

Есть миллион причин для того, чтобы хотеть это сделать.

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

Другие советы

Это пример того, как Одноэлементный Паттерн.Обычно у них есть Частное метод конструктора, но в примере, который я связал, они использовали защищенный чтобы предотвратить создание экземпляра.

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

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

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

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

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

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

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

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

  • Второй пример - это Одноэлементный паттерн:Фабрика, которая может создать только один экземпляр класса.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top