Итак, ваш вопрос о сравнении этого дизайна # 1:
IMobileFactory factory = LoadFactory("NokiaFactory");
к этому дизайну # 2:
NokiaFactory factory = new NokiaFactory(); // or:
IMobileFactory factory = new NokiaFactory();
Как вы видите, самое большое отличие состоит в том, что, хотя клиент в дизайне № 1 не знает о каком-либо конкретном типе, таком как NokiaFactory
или IPhoneFactory
, клиент в дизайне # 2 знает .
Недостаток знания о конкретных вещах, таких как NokiaFactory
или IPhoneFactory
, должен быть хорошо известен. Если вы хотите внести изменения в эти типы, например, вы хотите добавить новый метод к NokiaFactory
, и этот метод не является частью интерфейса IMobileFactory
, то на клиентский код будет оказываться влияние без необходимости . Клиент не заботится о новом методе, но его код должен быть перекомпилирован / повторно развернут.
UPDATE
Чтобы объяснить больше.
Например, новый метод с именем Foo
добавлен в класс NokiaFactory
:
class NokiaFactory {
// old code
public void Foo() { ... }
}
Foo
не является методом интерфейса IMobileFactory
, но он добавляется к NokiaFactory
, потому что есть другой клиент, которому требуется метод, и этот клиент рад зависимости от NokiaFactory
класса. Другими словами, этот клиент будет приветствовать изменения из NokiaFactory
класса, но первый клиент не будет.