Что такое статические методы фабрики?

Этот оператор будет возвращать все записи, чье имя ключа равно строке, указанной в строке. Если вы используете подстановочный знак, вы можете получить желаемые результаты. Например:

mDb.query(true, DATABASE_NAMES_TABLE, new String[] { KEY_ROWID,
            KEY_NAME }, KEY_NAME + " LIKE ?",
            new String[] { filter+"%" }, null, null, null,
            null);

Будет список всех записей, начинающихся со слова в фильтре.

mDb.query(true, DATABASE_NAMES_TABLE, new String[] { KEY_ROWID,
            KEY_NAME }, KEY_NAME + " LIKE ?",
            new String[] {"%"+ filter+ "%" }, null, null, null,
            null);

Будет список всех записей, содержащих слово в фильтре.

246
задан Tim 18 May 2016 в 11:39
поделиться

7 ответов

Мы избегаем предоставления прямого доступа к соединениям с базой данных, поскольку они требуют больших ресурсов. Поэтому мы используем статический фабричный метод getDbConnection , который создает соединение, если мы ниже лимита. В противном случае он пытается предоставить "запасное" соединение, но без исключения с исключением.

public class DbConnection{
   private static final int MAX_CONNS = 100;
   private static int totalConnections = 0;

   private static Set<DbConnection> availableConnections = new HashSet<DbConnection>();

   private DbConnection(){
     // ...
     totalConnections++;
   }

   public static DbConnection getDbConnection(){

     if(totalConnections < MAX_CONNS){
       return new DbConnection();

     }else if(availableConnections.size() > 0){
         DbConnection dbc = availableConnections.iterator().next();
         availableConnections.remove(dbc);
         return dbc;

     }else {
         throw new NoDbConnections();
     }
   }

   public static void returnDbConnection(DbConnection dbc){
     availableConnections.add(dbc);
     //...
   }
}
119
ответ дан 23 November 2019 в 03:02
поделиться

Статический фабричный метод хорош, если вы хотите убедиться, что только один единственный экземпляр будет возвращать конкретный класс, который будет использоваться.

Например, в классе подключения к базе данных вы может потребоваться, чтобы только один класс создавал соединение с базой данных, так что если вы решите переключиться с Mysql на Oracle, вы можете просто изменить логику в одном классе, а остальная часть приложения будет использовать новое соединение.

Если вы Если вы хотите реализовать пул баз данных, то это также будет сделано, не затрагивая остальную часть приложения.

Он защищает остальную часть приложения от изменений, которые вы можете внести в фабрику, что и является целью.

Причина, по которой он статичен, заключается в том, что если вы хотите отслеживать некоторый ограниченный ресурс (количество подключений к сокетам или дескрипторы файлов), тогда этот класс может отслеживать, сколько из них было передано и возвращено, поэтому вы не должны t исчерпать ограниченный ресурс.

1
ответ дан 23 November 2019 в 03:02
поделиться

Заводской метод метод, который абстрагирует создание экземпляра объекта. Обычно фабрики полезны, когда вы знаете, что вам нужен новый экземпляр класса, который реализует некоторый интерфейс, но вы не знаете реализующий класс.

Это полезно при работе с иерархиями связанных классов, хорошим примером этого будет быть набором инструментов GUI. Вы можете просто жестко запрограммировать вызовы конструкторов для конкретных реализаций каждого виджета, но если вы когда-нибудь захотите поменять один инструментарий на другой, у вас будет много мест, которые нужно изменить. Используя фабрику, вы сокращаете объем кода, который необходимо изменить.

4
ответ дан 23 November 2019 в 03:02
поделиться

Все сводится к ремонтопригодности. Лучший способ выразить это - всякий раз, когда вы используете ключевое слово new для создания объекта, вы связываете код, который вы пишете, с реализацией.

Заводской шаблон позволяет вам разделить то, как вы работаете. создать объект из того, что вы делаете с объектом. Когда вы создаете все свои объекты с помощью конструкторов, вы, по сути, жестко подключаете код, который использует объект, к этой реализации. Код, который использует ваш объект, «зависит» от этого объекта. На первый взгляд это может показаться неважным, но когда объект изменяется (подумайте об изменении сигнатуры конструктора или создании подкласса объекта), вам придется вернуться и переустановить все где угодно.

Сегодня фабрики в значительной степени отвергаются в пользу использования внедрения зависимостей, потому что они требуют большого количества шаблонного кода, который, как оказалось, немного сложно поддерживать. Внедрение зависимостей в основном эквивалентно фабрикам, но позволяет вам указать, как ваши объекты связаны друг с другом декларативно (через конфигурацию или аннотации).

18
ответ дан 23 November 2019 в 03:02
поделиться
  • имеют имена, в отличие от конструкторов, которые могут прояснять код.
  • не нужно создавать новый объект при каждом вызове - объекты могут быть кэшированы и повторно использованы при необходимости.
  • может возвращать подтип своего возвращаемого типа - в частности, может вернуть объект, класс реализации которого неизвестен вызывающему. Это очень ценная и широко используемая функция во многих фреймворках. которые используют интерфейсы в качестве типа возвращаемого значения статических заводских методов.

из http://www.javapractices.com/topic/TopicAction.do?Id=21

20
ответ дан 23 November 2019 в 03:02
поделиться

Читаемость можно улучшить с помощью статических фабричных методов:

Сравните

public class Foo{
  public Foo(boolean withBar){
    //...
  }
}

//...

// What exactly does this mean?
Foo foo = new Foo(true);
// You have to lookup the documentation to be sure.
// Even if you remember that the boolean has something to do with a Bar
// you might not remember whether it specified withBar or withoutBar.

с

public class Foo{
  public static Foo createWithBar(){
    //...
  }

  public static Foo createWithoutBar(){
    //...
  }
}

// ...

// This is much easier to read!
Foo foo = Foo.createWithBar();
67
ответ дан 23 November 2019 в 03:02
поделиться

Статический шаблон фабричного метода - это способ инкапсулировать создание объекта. Без фабричного метода вы просто вызываете конструктор класса напрямую: Foo x = new Foo () . С помощью этого шаблона вместо этого вы должны вызвать фабричный метод: Foo x = Foo.create () . Конструкторы помечены как частные, поэтому их нельзя вызывать, кроме как изнутри класса, а фабричный метод помечен как static , чтобы его можно было вызвать без предварительного создания объекта.

Есть несколько преимущества этого шаблона. Во-первых, фабрика может выбирать из множества подклассов (или реализаторов интерфейса) и возвращать их. Таким образом, вызывающий может указать желаемое поведение с помощью параметров, без необходимости знать или понимать потенциально сложную иерархию классов.

Еще одним преимуществом является, как указали Мэтью и Джеймс, контроль доступа к ограниченному ресурсу, например соединениям. Это способ реализовать пулы повторно используемых объектов - вместо создания, использования и разрушения объекта, если строительство и разрушение являются дорогостоящими процессами, может иметь смысл построить их один раз и переработать. Фабричный метод может вернуть существующий неиспользуемый экземпляр объекта, если он есть, или создать его, если количество объектов ниже некоторого нижнего порога, или выдать исключение, или вернуть null , если оно выше верхнего порога.

Согласно статье в Википедии, несколько фабричных методов также позволяют по-разному интерпретировать похожие типы аргументов. Обычно имя конструктора совпадает с именем класса, что означает, что у вас может быть только один конструктор с заданной сигнатурой . Фабрики не так ограничены, что означает, что у вас может быть два разных метода, которые принимают одни и те же типы аргументов:

Coordinate c = Coordinate.createFromCartesian(double x, double y)

и

Coordinate c = Coordinate.createFromPolar(double distance, double angle)

Это также можно использовать для улучшения читаемости, как отмечает Расмус.

455
ответ дан 23 November 2019 в 03:02
поделиться
Другие вопросы по тегам:

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