Значение data-target в индикаторах карусели должно совпадать с идентификатором carousel, в этом случае оно должно быть data-target = "# carouselExampleIndicators"
Они - оба примеры шаблона "фабричный метод". Единственная разница - то, что второй пример имеет метод в своем собственном статическом классе.
Это было бы примером шаблона "абстрактная фабрика":
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];
}
В моем понимании метод фабрики определяет абстрактный тип класса, с которым можно работать с, но можно делегировать создание конкретного типа к следованию/классам с реализацией. Абстрактная фабрика определила бы интерфейс для manufactorer ряда соответствующих классов. Разработчик работает просто для создания объекта, шаг за шагом дающего некоторый контроль к экземпляру вызова.