Шаблон проектирования фабричного метода выглядит как оператор If / Else или Switch. Что мне не хватает? - PullRequest
0 голосов
/ 03 ноября 2018

Итак, я пытался освежить свои шаблоны проектирования (спасибо, колледж, что не учил их ...), и шаблон проектирования Factory Method доставляет мне неприятности.


Обратимся к этому Шаблону разработки метода фабрики в C # , чтобы не допустить попадания в область вопроса тонны кода. У меня нет личного кода, я просто пытаюсь понять шаблоны проектирования


Я понимаю, что есть несколько частей:

  1. Продукт - CreditCard
  2. Бетонный продукт- MoneyBackCreditCard, TitaniumCreditCard, PlatinumCreditCard
  3. Создатель-CardFactory
  4. ConcreteCreator - MoneyBackCardFactory, TitaniumCardFactory, PlatinumCardFactory

Когда я смотрю на реализацию, все, что я вижу, - это набор объектов (с общим предком), конструктор которых определяется и вызывается на основе некоторой переменной.

Я предполагаю, что есть что-то более правильное? Последнее, что я знал, создание объекта в операторе if / else или switch не определяло шаблон проектирования. Я не понимаю, что делает это особенным.

Спасибо всем, кто откликнулся.

Ответы [ 2 ]

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

В упомянутой статье не дается хорошее объяснение паттерна Factory Method. На диаграмме UML есть метод AnOperation, но в коде его нет. На самом деле этот метод является наиболее интересной точкой паттерна Factory Method.

Мотивация этого шаблона заключается в том, что в каком-то методе AnOperation класса вы хотите гибко создать новый экземпляр другого класса . Сначала вы просто создаете экземпляр, используя ключевое слово new. Но позже, когда ваша программа elvoves, вы обнаружите, что она недостаточно гибкая, поскольку класс, упомянутый после ключевого слова new, всегда должен быть конкретным классом. Таким образом, вы абстрагируете это создание в абстрактный метод и позволяете производным классам реализовать его. Это называется шаблоном фабричного метода. Вы даже можете добиться большей гибкости, помещая такие абстрактные методы в отдельный класс / интерфейс. Это называется шаблоном Абстрактной Фабрики, и, конечно, он более сложный.

Операторы if/else/switch/case в статье совершенно не связаны с шаблоном Factory Method. Шаблон не касается того, какой конкретный завод выбран пользователями, это отдельная история. Обычно этот выбор происходит в CompositionRoot вашей программы. Метод main - это такое место.

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

Короче говоря, интерфейс используется для создания объекта, однако подкласс решает, какой класс создать. Создание объекта выполняется тогда, когда это требуется. Метод Factory позволяет позднее создавать классы для подклассов.

enter image description here

interface Product {}

class ConcreteProductA : Product {}

class ConcreteProductB : Product {}

abstract class Creator
{
    public abstract Product FactoryMethod(string type);
}

class ConcreteCreator : Creator
{
    public override Product FactoryMethod(string type)
    {
        switch (type)
        {
           case "A": return new ConcreteProductA();
           case "B": return new ConcreteProductB();
           default: throw new ArgumentException("Invalid type", "type");
        }
    }
 }

Оригинал

В фабричном шаблоне нет ничего загадочного, на самом деле он один из самых простых и простых Дизайнерских шаблонов .

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

interface IMyLovelyHorse {...}

public class MyGreenHorse : IMyLovelyHorse {...}

public class MyYellowHorse : IMyLovelyHorse {...}

public class MyLittleHorse : IMyLovelyHorse {...}

...

public override IMyLovelyHorse CreateMyHorse(sometype somevalue)
{  
    switch(sometype)
    {
        case "MyGreenHorse" : return new MyGreenHorse();
        ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...