фабрика просто возвращает реализацию интерфейса? - PullRequest
4 голосов
/ 17 декабря 2009

фабрика просто возвращает реализацию интерфейса? Это работа?

Ответы [ 5 ]

13 голосов
/ 17 декабря 2009

Иногда это все, что делает фабрика, но они также могут:

  • Выберите конкретную реализацию на основе данных, которые доступны только во время выполнения:

    // Beverage Factory
    public IBeverage CreateBeverage(DateTime orderDate) {
        return orderDate.Hour > 12 ? new Beer() : new Milk();
    }
    
  • Выполнение инициализации после построения (часто дорогая инициализация или инициализация данных, которые не подходят для инкапсуляции внутри самого объекта):

    // Weather report factory
    public IWeatherReport CreateWeatherReport() {
        WeatherReport report = new WeatherReport();
        report.data = WeatherWebService.GetData();
        return report;
    }
    
  • Инициализировать новый экземпляр на основе существующего экземпляра:

    // Fittest Algorithm Factory
    public Algorithm CreateNewAlgorithm() {
        return this.fittestAlgorithm.Clone();
    }
    
  • Нарисуйте экземпляр из пула вместо создания с нуля:

    public IDbConnection CreateConnection(string connectionString) {
        return this.ConnectionStacks[connectionString].Pop();
    }
    
  • Возвращает экземпляр синглтона (правда, блин, и вам лучше убедиться, что он безопасен для потоков!)

4 голосов
/ 17 декабря 2009

из вики:

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

4 голосов
/ 17 декабря 2009

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

2 голосов
/ 17 декабря 2009

Пара больше великих ресурсов по этому вопросу:

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

(Hammer|IHammer|...) GetHammer(string hammername);

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

2 голосов
/ 17 декабря 2009

По сути, да.

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

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

...