Каковы различия между Разработчиком, Методом фабрики и Шаблонами "абстрактная фабрика"?

Значение data-target в индикаторах карусели должно совпадать с идентификатором carousel, в этом случае оно должно быть data-target = "# carouselExampleIndicators"

12
задан ilitirit 10 October 2008 в 12:03
поделиться

2 ответа

Они - оба примеры шаблона "фабричный метод". Единственная разница - то, что второй пример имеет метод в своем собственном статическом классе.

Это было бы примером шаблона "абстрактная фабрика":

abstract class MessageProcessorFactory
 { public abstract MessageProcessor GetProcessor
                                     (Message message, DataDomain data);
 }

class FooMessageProcessorFactory :  MessageProcessorFactory
 { public override MessageProcessor GetProcessor
                                     (Message message, DataDomain data)
    { return new FooMessageProcessor(data.Name, data.Classification);
    }
 }

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

Передача ProcessBuilder для создания процесса была бы стратегической моделью:

class MessageProcessor
 { ProcessBuilder builder;

   public MessageProcessor(ProcessBuilder builder)
    { this.builder = builder;
    }

   public void Process()
    { builder.BuildMessage();
      builder.BuildProcess();
      builder.Process();
    }
 }

var mp = new MessageProcessor(new FooProcessBuilder());

Простое решение состояло бы в том, чтобы инкапсулировать метод фабрики:

static void Process(Message msg, DataDomain data)
 { var p = getProcessor(msg.GetType());
   p.Process(msg, data);
 }

Если это - маленькое известное количество типов, можно использовать ряд проверок типа:

private static MessageProcessor getProcessor(Type msgType)
 { return   (msgType == typeof(FooMessage)) ? new FooMessageProcessor()
          : (msgType == typeof(BarMessage)) ? new BarMessageProcessor()
          :                                   new DefaultMessageProcessor();
 }

Иначе используйте словарь:

Dictionary<Type,MessageProcessor> processors;    

private static MessageProcessor getProcessor(Type msgType) 
 { return processors[msgType];
 }
10
ответ дан 2 December 2019 в 21:46
поделиться

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

2
ответ дан 2 December 2019 в 21:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: