Простой фабричный метод против фабричного - PullRequest
0 голосов
/ 19 ноября 2018

Простая фабрика: enter image description here

Заводской метод:

enter image description here

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

В шаблоне Factory Method мы представим новый интерфейс под названием «IMobileFactory» и две конкретные реализации «NokiaFactory» и 'IphoneFactory. Эти конкретные классы управляют созданием объекта.

В моем примере клиенту нужен объект Nokia. Итак, шаги даны ниже.

1. Клиент загрузит ссылку на «NokiaFactory». Но Клиент не будет ссылаться на класс NokiaFactory напрямую, как Simple Factory шаблон. Клиент направляет конкретную реализацию через интерфейс «IMobileFactory».

2. Затем клиент вызывает метод «CreateMobile ()», который возвращает объект типа «IMobile».

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

Я не могу понять первый шаг:

Но Клиент не будет ссылаться на класс NokiaFactory напрямую, как Простой Фабричный образец. Клиент ссылается на конкретную реализацию через интерфейс «IMobileFactory».

клиент пишет что-то вроде этого:

IMobileFactory factory = LoadFactory("NokiaFactory");

так почему это полезно и лучше? в чем выгода? почему я не должен просто написать это:

NokiaFactory factory = new NokiaFactory();

или что с этим:

IMobileFactory factory = new NokiaFactory();

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Итак, ваш вопрос о сравнении этого дизайна # 1:

IMobileFactory factory = LoadFactory("NokiaFactory");

к этому дизайну # 2:

NokiaFactory factory = new NokiaFactory(); // or:
IMobileFactory factory = new NokiaFactory();

Как вы видите, самое большое отличие состоит в том, что, хотя клиент в дизайне № 1 не знает о каком-либо конкретном типе, таком как NokiaFactory или IPhoneFactory, клиент в дизайне # 2 знает .

Недостаток знания о конкретных вещах, таких как NokiaFactory или IPhoneFactory, должен быть хорошо известен. Если вы хотите внести изменения в эти типы, например, вы хотите добавить новый метод к NokiaFactory, и этот метод не является частью интерфейса IMobileFactory, то на клиентский код будет оказываться влияние без необходимости . Клиент не заботится о новом методе, но его код должен быть перекомпилирован / повторно развернут.

UPDATE

Чтобы объяснить больше.

Например, новый метод с именем Foo добавлен в класс NokiaFactory:

class NokiaFactory {
    // old code
    public void Foo() { ... }
}

Foo не является методом интерфейса IMobileFactory, но он добавляется к NokiaFactory, потому что есть другой клиент, которому требуется метод, и этот клиент рад зависимости от NokiaFactory класса. Другими словами, этот клиент будет приветствовать изменения из NokiaFactory класса, но первый клиент не будет.

0 голосов
/ 19 ноября 2018

С точки зрения дизайна:

  • Используйте SimpleFactory, когда типы объектов не являются фиксированными.Например: телефоны моего производителя - Nokia, iPhone.Может быть, вы захотите добавить нового производителя завтра.

  • Используйте фабричный метод, когда типы объектов фиксированы.Например: телефоны по типу - стационарный и мобильный.

Наконец, все сводится к тому, как вы хотите создать свою систему.То, что вы хотите быть расширяемым.

0 голосов
/ 19 ноября 2018

Вам нужен интерфейс, чтобы избежать создания разных потоков для каждого типа, для 10 типов у вас будет 1 строка кода вместо 10

IMobileFactory factory = loadFactory(myFactoryName);

вместо каждого типа:

NokiaFactory factory = new NokiaFactory();
...
IphoneFactory factory = new IphoneFactory();
...

Разница между использованием loadFactory метода и new NokiaFactory() заключается в том, что вам не нужно явно создавать новый объект, вы делегируете создание объекта loadFactory, который возвращает соответствующий объект

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