2012-05-02 4 views
3

Так что я не уверен, что это законная фабрика или нет. Большинство завода я вижу что-то вроде этого в клиенте:Создание фабрики C#

if(//something) 
    factory = new Type1Factory(); 
else 
    factory = new RegularFactory(); 

И затем они создают объект, идя как factory.Create();

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

Что-то вроде этого:

DateScheduleRequest request = new DateScheduleRequest(); 
DateScheduleBuilder dateScheduleBuilder = new DateScheduleBuilderFactory(request).Create(); 

И dateScheduleBuilder объект будет в основном быть определенного типа в зависимости от запроса, отправленного на заводе конструктором.

Есть ли другой шаблон для этого или это только определенный способ сделать заводы?

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

+0

Это звучит прекрасно, и это совершенно законно завод по GoF –

ответ

2

Я думаю, что вы описываете заводскую структуру во второй части. Первая часть - не потому, что он полагается на вызывающего, чтобы знать, как построить желаемый объект. В вашем примере DateScheduleBuilderFactory сможет узнать, как интерпретировать информацию в объекте request и вернуть объект, который происходит от DateScheduleBuilder.

Одним словом, как и Johm Dom, сказано выше. Вы уже там ...

+1

Да. В моем чтении @slandau считает, что если 'DateScheduleBuilder dateScheduleBuilder' не является именно этим базовым типом' DateScheduleBuilder', то он не учитывается. Но это так. –

1

Во-первых, первый сниппет отлично. Я бы скорее потратил свое время на добавление функций, исправляя ошибки, чем рефакторинг.

Если бы я проектировал этот код с нуля, я бы спрятал if, например. в конструкторе. Хорошее эмпирическое правило: «Всякий раз, когда библиотека может сделать что-то легко для потребителя, она должна это делать».

Третий вариант - переместить оператор if в vtable - полиморфизм.

+0

Мне нравится скрывать IF в конструкторе и использовать поведение Polymorphism для облегчения жизни. – Turbot

1

У вас все в порядке.

Альтернативой может быть заводская фабрика. Таким образом, у вас есть класс, который имеет метод, который получает реализацию фабрики на основе запроса (что-то вроде IDateScheduleBuilderFactory GetDateSceduleBuilderFactory(request), а затем потребитель называет Create() на IDateScheduleBuilderFactory получить объект строителя.

Его немного более запутанным, но будет означать, у вас есть один класс с отдельными обязанностями (т. е. один класс, задачей которого является превращение запроса в правильный тип фабрики, а другие классы - фактические разные типы фабрик), и вы могли бы легче проверить это. Как вы чтобы проверить, что правильный тип фабрики используется с учетом конкретного запроса сейчас? Вы должны были бы определить это по результату create, а не просто проверять тип, возвращаемый методом GetDateSceduleBuilderFactory().

У вас также могут быть ваши текущие фабрики, например, public bool CanHandleRequest(request), которые позволят каждой фабрике решить, была ли эта фабрика подходящей для конкретного запроса, тогда заводская фабрика могла принять коллекцию заводов в своем конструкторе и когда GetDateSceduleBuilderFactory(request) метод назывался так, что он мог обходить все фабрики, спрашивая каждого, если он может обрабатывать запрос и когда он находит тот, который может его вернуть.

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

0

Строго говоря, это не фабрика, так как она не использует тип, чтобы решить, какой объект создать, но это такая общая (и полезная) идиома, что книга Head First Design Patterns называет ее простой фабрикой ,

Это совершенно законно, на мой взгляд, и очень полезно (например, при создании стратегий) в нужном месте,

Смежные вопросы