Передающие аргументы определенному подклассу, через метод фабрики

Мне кажется, что ошибка в \ xa9 - погоня за диким гусем.

Инструкции Пандока изменились. Замена этой старой строфы

header-includes:
-  \usepackage{xcolor}
-  \usepackage{fancybox}
-  \usepackage{calc}
-  \usepackage{subfig}

С помощью этой новой решена проблема.

header-includes:
- |
  ```{=latex}
  \usepackage{xcolor}
  \usepackage{fancybox}
  \usepackage{calc}
  \usepackage{subfig}
  ```

После этого я добился успеха с Pandoc 2.6.

Сначала я подумал, что понял проблему, но потом это повторилось, и я полностью набрал новую строфу, и Pandoc больше не выдает ошибку. Итак, я в замешательстве .

Я еще не нашел ответ на проблему PNG на Macintosh.

8
задан JW. 13 May 2009 в 16:41
поделиться

6 ответов

Я бы создал разные методы перегрузки в ваш фабричный класс.

public class DrinkFactory {

    public static Drink CreateBeer(DrinkConfig config, string hops) {
        return new Beer(config, hops);
    }

    public static Drink CreateWine(DrinkConfig config, string grapes, int temperature) {
        return new Wine(config, grapes, temperature);
    }
}

Изменить:

Если желательно иметь только один метод в фабричном классе, альтернативной реализацией будет:

public enum DrinksEnum {
    Beer,
    Wine
}

public class DrinkFactory {

    public static Drink CreateDrink(DrinksEnum drinkType, DrinkConfig config) {
        switch(drinkType) {
            case DrinksEnum.Beer:
                return new Beer(config);
            case DrinksEnum.Wine:
                return new Wine(config);
            default:
                throw new ApplicationException("Drink type not recognised.");
        }
    }
}
4
ответ дан 5 December 2019 в 21:21
поделиться

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

2
ответ дан 5 December 2019 в 21:21
поделиться

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

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

1
ответ дан 5 December 2019 в 21:21
поделиться

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

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

0
ответ дан 5 December 2019 в 21:21
поделиться

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

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

Если вам действительно нужно передать помощников во время выполнения из вызывающего кода, я предлагаю прочитать статью «Аргументы и результаты» ( http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.50.7565 ), в которой описывается общий шаблон для сортировки сложные аргументы. По существу,

0
ответ дан 5 December 2019 в 21:21
поделиться

В подобных случаях я обычно ищу другие решения вместо того, чтобы передавать переменные.

Например, в вашем случае - WineFactory требуется сомелье, поэтому он может построить соответствующее Wine -

Это отличный вариант использования для внедрения зависимостей во время выполнения. Фреймворк внедрения зависимостей в той или иной форме сделает эту работу очень простой, понятной и беспроблемной без необходимости передавать все эти свойства.

0
ответ дан 5 December 2019 в 21:21
поделиться