Подтвердить что ты не робот

Factory Шаблон - CreateInstance статический или нет?

Это о шаблоне Factory. Я немного смущен.

Я видел реализации, в которых метод createInstance() является статическим и некоторые нестатические реализации.

Некоторые говорят, что это зависит от "стиля" или "вкуса", а некоторые говорят, что это не так. Википедия говорит, что она должна быть нестатической, а http://www.dofactory.com/Patterns/PatternFactory.aspx также говорит о том, что она должна быть нестатической, сообщается в Gang of Four.

Мой вопрос: зависит ли он от стиля и вкуса или нарушает шаблон Factory, если он реализовал статический путь? Какое право?

4b9b3361

Ответ 1

Статический метод не нарушает шаблон, но он противоречит многим другим объектно-ориентированным практикам (инверсия управления + инъекция зависимостей как один пример), поэтому лучше использовать экземпляры.

Edit:

Я только что получил значок для этого ответа, но когда я его прочитал, я не мог поверить своим глазам. Это неправильно, когда мы строго говорим о шаблоне метода GoF Factory, и он заслуживает некоторой коррекции.

У вас может быть статический метод CreateInstance для создания экземпляра типа - в этом нет ничего плохого - люди часто называют его методом Factory, но это не то, что называется Factory Метод pattern. После того, как вы начнете вводить логику в этот метод для создания экземпляров разных типов в зависимости от какого-либо условия, вам может понадобиться Factory шаблон метода, описанный GoF.

Точка метода GoF Factory заключается в замене условной логики внутри CreateInstance наследованием и полиморфизмом и, следовательно, она не может быть статичной. Factory метод - это метод экземпляра, более того, он виртуальный. Ваш базовый тип обычно абстрактный CreateInstance, а условная логика заменяется деревом наследования, где каждый подтип переопределяет CreateInstance и создает только определенный продукт для этого подтипа.

Ответ 2

Я очень сомневаюсь классифицировать "экземпляр против статического" как вопрос вкуса. Этот тип подразумевает, что он эстетичен, как любимый цвет или, более подходящий, camelCase и PascalCase.

Экземпляр против статики - это скорее вопрос компромиссов. С примерами членов любого рода вы получаете все преимущества полиморфизма, поскольку вы можете реализовать интерфейсы и наследовать от других классов, когда у вас есть экземпляры и члены экземпляра. С помощью статики вы не получаете эти преимущества. Как правило, static versus instance - это компромисс между простотой и простотой. Статика проста, потому что они доступны по всему миру, и вам не нужно учитывать такие вещи, как "когда это должно быть создано и кем?". Вам не нужно передавать их с помощью аксессуаров/мутаторов или конструкторов, и ваш API выглядит чище. Это упрощает рассуждения. Но это упрощает техническое обслуживание и будущие реализации.

Если у вас есть статический метод - скажем, метод factory в вашем случае - и вы позже захотите, чтобы в определенных ситуациях он вел себя по-разному, вы вроде бы взволнованы. Вы должны сделать второй метод и скопировать и вставить функции минус все, что вы хотите изменить, а затем попросите клиентов понять это. Или, что еще хуже, вы выставляете глобальную переменную и устанавливаете ее клиентами до и после использования вашего метода, а глобальное значение указывает, как вести себя.

Если бы вы отправили маршрут экземпляра вперед, это было бы легко. Вы просто наследуете и переопределяете свой первоначальный метод factory и предоставляете производные классы, где вам нужны новые функции. Вы не ставите дополнительную нагрузку на код клиента, и вы практически не изменяете существующие классы (принцип open/closed).

Мои советы состоят в том, чтобы в будущем вам и/или другим сопровождающим оказать поддержку и использовать реализацию экземпляра. Это не вопрос того, что Банда Четырех или кого-либо еще хочет или предпочитает - это вопрос вашего собственного здравомыслия перед лицом гниения кода.

Ответ 3

Если его значение abstract factory, то уровень экземпляра является нормальным. И функциональность уровня экземпляра, как правило, легче высмеивать и unit test чем static уровень