Смысл здесь в том, чтобы централизовать блоки кода, имеющие возможность изменения. Если вы рассредоточиваете одни и те же блоки if-else вокруг нескольких классов, то, если позднее потребуется внести изменения, вам придется вносить изменения во всех местах. IDE предлагает вам найти и заменить утилиту, но даже в этом случае это не очень хорошая практика, по крайней мере, из-за отдельной компиляции.
С фабричным шаблоном вы помещаете эту if-else logi c в одном месте и Передайте объект, который является суперпечатным полиморфом c, который вы получаете от фабрики, вашим классам, и затем вы будете использовать преимущества динамической диспетчеризации c, например, с шаблонами методов стратегии или шаблонов.
Давайте посмотрим на примере (для краткости это базовый пример c, поэтому я не проводил рефакторинг для несвязанных вещей):
public class ConnectionPolicyFactory {
public ConnectionPolicy getPolicy(String dbVendor) {
if (dbVendor == "ORACLE") {
return new OracleConnectionPolicy();
} else if (dbVendor == "SQL_SERVER")) {
return new SqlServerConnectionPolicy();
}
//exceptional cases
}
}
затем в клиенте:
ConnectionPolicyFactory connectionPolicyFactory = new ConnectionPolicyFactory();
//this is the parent of Connection types.
ConnectionPolicy connectionPolicy = connectionPolicyFactory.getPolicy("ORACLE");//which is OracleConnectionPolicy
MyClass myClass = new MyClass();
myClass.foo(connectionPolicy);
тогда в вашем классе, возможно, вы делаете что-то вроде:
public class MyClass {
//...
public void foo(ConnectionPolicy conn) {
conn.someVendorSpecificAction();
}
//...
}
Если вы не использовали фабрику и когда у вас, вероятно, было больше классов, использующих эту ConnectionPolicy, у вас было бы все Логика if-else во всех ваших классах.