Фабрика реализована статическим методом

Я видел реализацию Factory с использованием статических методов. Что-то вроде этого:

public class MyFactory {
    public static Product1 createProduct1() {}
    public static Product2 createProduct2() {}
}

p1 = MyFactory.createProduct1();
p2 = MyFactory.createProduct2();

Я не уверен, могу ли я назвать это Абстрактной фабрикой, но вопрос не в этом. Что я понимаю в абстрактной фабрике, так это то, что она дает нам возможность легко менять семейства продуктов.

Factory factory = new MyFactory();  // might be a global or Singleton
p1 = factory.createProduct1();
p2 = factory.createProduct2();

И если я хочу изменить с MyFactory на YourFactory, то для изменения требуется только одна строка. Я также могу изменить это во время выполнения. Но возможно ли это, если они реализованы как статический метод? Мне нужно изменить все вызовы на статическую фабрику. А также нужно использовать проверку if-else во всех местах, если мы хотим решить во время выполнения.

p1 = YourFactory.createProduct1();
p2 = YourFactory.createProduct2();

Итак, в чем преимущество реализации factory с использованием статических методов? Не теряем ли мы основную гибкость? Что я здесь пропустил?

Обратите внимание, что какой-либо конкретный язык не предполагается. Любая помощь приветствуется.


person taskinoor    schedule 18.04.2011    source источник


Ответы (5)


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

Одиночка лишь немного лучше. Она позволяет вам нормально писать свою логику с переменными-членами. (состояние), а затем просто сделайте пару настроек, чтобы превратить его в синглтон. Допустим, вы делали пул экземпляров на своей фабрике, синглтон мог бы подойти там. Вы все равно упускаете контекст.

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

person Mike Valenty    schedule 18.04.2011

Я собирался сказать, что не вижу преимуществ использования этой фабрики по сравнению с созданием экземпляров ваших объектов через new Product1() и т. д.

Однако это не совсем правильно. Вы можете выбрать реализацию для базового класса при использовании такой фабрики, и это может быть причиной, по которой они ее реализовали. Например, метод createProduct1() может быть реализован как return new JumboProduct1();, где JumboProduct1 является производным от Product1, а остальная часть кода будет изолирована от такого решения политики. Не очень гибкий, но, я полагаю, он справился бы с работой.

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

person vhallac    schedule 18.04.2011

Здесь нет никаких преимуществ абстрактной фабрики. Только если этот метод является Builder, вы можете инкапсулировать некоторую условную логику в методы createProductX().

person Victor Sergienko    schedule 18.04.2011

taskinoor, Использование статических методов не рекомендуется в чистом объектно-ориентированном программировании по нескольким причинам.

  1. Вы не можете добиться внедрения зависимостей с помощью статических методов.
  2. Написание сценариев модульных тестов очень сложно и почти невозможно. Лично я, когда начал программировать, много мучился с внедрением UT со статическими методами.

Сказав, что у статических методов мало преимуществ. Если вы создаете библиотечные функции, которые, как правило, остаются неизменными во время выполнения, статические методы являются хорошим выбором.

Пожалуйста, посмотрите на реализацию абстрактной фабрики здесь. Я не думаю, что для достижения абстрактной фабрики необходимо использовать «статические» методы. http://www.dofactory.com/Patterns/PatternAbstract.aspx#_self1

person Sandeep G B    schedule 18.04.2011

Для краткости, использование статического метода для создания экземпляров объектов является самым чистым, если у вас есть большое количество объектов для настройки. Например, сравните:

textObject = new TextUI("Code Example");
textObject.move(50, 80);
textObject.size(100, 200);

и:

textObject = TextUI.make("Code Example").move(50, 80).size(100, 200);

Замена трех строк на одну делает конфигурацию более чистой, а строку более переносимой — требуется только одно изменение имени переменной. Вы также получаете выгоду от автозаполнения каждой точкой при использовании правильной IDE, что значительно упрощает написание новых строк и добавление новых свойств.

person Markavian    schedule 03.01.2014