Как шаблон Factory Method делает код поддерживаемым в этом случае - PullRequest
0 голосов
/ 06 января 2020

Я новичок в разработке шаблонов, я читал книгу, в которой говорится: В приложении могут быть разные пользователи базы данных. Например, один пользователь может использовать Oracle, а другой может использовать SQL Сервер. Всякий раз, когда вам нужно вставить данные в вашу базу данных, вам нужно создать SqlConnection или OracleConnection, и только тогда вы сможете продолжить. Если вы помещаете код в операторы if-else (или switch), вам нужно повторить много кода, который не так просто поддерживать. Это потому, что всякий раз, когда вам нужно поддерживать новый тип соединения, вам необходимо заново открыть свой код и внести эти изменения. Этот тип проблемы может быть решен с использованием шаблона Factory Method.

Я немного запутался здесь, если вам нужно использовать новый тип соединения, просто добавьте новый файл класса этого класса соединения (например,

NEWGenerationConnection), затем просто используйте NewGenerationConnection connection = new NewGenerationConnection(connectionString); connection.open(); .... , как здесь используется if-else? а зачем нужно модифицировать файл базового кода? может кто-нибудь написать для меня какой-нибудь псевдокод, чтобы я лучше понял проблему?

1 Ответ

1 голос
/ 06 января 2020

Смысл здесь в том, чтобы централизовать блоки кода, имеющие возможность изменения. Если вы рассредоточиваете одни и те же блоки 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 во всех ваших классах.

...