Какой "статический factory" метод?
Что такое статические методы factory?
Ответ 1
Мы избегаем прямого доступа к соединениям с базой данных, потому что они ресурсоемкие. Поэтому мы используем статический метод factory 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);
//...
}
}
Ответ 2
static factory шаблон метода - это способ инкапсуляции создания объекта. Без метода factory вы просто вызываете класс constructor напрямую: Foo x = new Foo()
. С помощью этого шаблона вместо этого вы вызываете метод factory: Foo x = Foo.create()
. Конструкторы отмечены как частные, поэтому их нельзя вызывать, кроме как изнутри класса, а метод factory помечен как static
, так что он может быть вызван без первого объекта.
Есть несколько преимуществ для этого шаблона. Один из них заключается в том, что factory может выбирать из многих подклассов (или реализаторов интерфейса) и возвращать их. Таким образом, вызывающий может указать поведение, требуемое с помощью параметров, без необходимости знать или понимать потенциально сложную иерархию классов.
Еще одно преимущество, как указывал Мэтью и Джеймс, - контролировать доступ к ограниченному ресурсу, например, к соединениям. Это способ реализовать пулы объектов многократного использования - вместо того, чтобы строить, использовать и разрывать объект, если строительство и уничтожение являются дорогостоящими процессами может иметь смысл строить их один раз и перерабатывать их. Метод factory может возвращать существующий, неиспользуемый экземпляр объекта, если он есть, или построить его, если количество объектов ниже некоторого нижнего порога, или выкинуть исключение или вернуть null
, если оно выше верхнего порога.
Согласно статье в Википедии, несколько методов factory также допускают разные интерпретации подобных типов аргументов. Обычно конструктор имеет то же имя, что и класс, что означает, что вы можете иметь только один конструктор с заданным signature. Заводы не так ограничены, а это значит, что у вас могут быть два разных метода, которые принимают одни и те же типы аргументов:
Coordinate c = Coordinate.createFromCartesian(double x, double y)
и
Coordinate c = Coordinate.createFromPolar(double distance, double angle)
Это также можно использовать для повышения удобочитаемости, как отмечает Rasmus.
Ответ 3
ВНИМАНИЕ! " статический factory метод НЕ совпадает с шаблоном Factory. (C) Эффективная Java, Джошуа Блох.
Factory Метод: "Определите интерфейс для создания объекта, но пусть классы, реализующие интерфейс, решают, какой класс должен быть создан. Метод factory позволяет классу переносить экземпляр на подклассы" (с) GoF.
"Статический factory метод - это просто статический метод, возвращающий экземпляр класса". (c) Эффективная Java, Джошуа Блох. Обычно этот метод находится внутри определенного класса.
Отклонение:
Основная идея статического метода factory заключается в том, чтобы получить контроль над созданием объекта и делегировать его от конструктора к статическому методу. Решение объекта, создаваемого, как в Abstract factory, сделало метод (в общем случае, но не всегда). Хотя ключевая (!) Идея метода factory заключается в делегировании решения о том, какой экземпляр класса создается внутри метода factory. Например. классическая реализация Singleton - частный случай статического метода factory. Пример широко используемых статических factory методов:
- valueOf
- getInstance
- newInstance
Ответ 4
Считывание можно улучшить с помощью статических методов factory:
Сравнение
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();
Ответ 5
- имеют имена, в отличие от конструкторов, которые могут уточнять код.
- не нужно создавать новый объект при каждом вызове - объекты могут быть кэшированы и повторно использованы, если это необходимо.
- может возвращать подтип своего типа возврата - в частности, может вернуть объект, класс реализации которого неизвестен вызывающему. Это очень ценная и широко используемая функция во многих рамках которые используют интерфейсы как возвращаемый тип статических factory методов.
Ответ 6
Все это сводится к ремонтопригодности. Лучший способ выразить это - всякий раз, когда вы используете ключевое слово new
для создания объекта, вы связываете код, который вы пишете, с реализацией.
Шаблон factory позволяет вам отделить способ создания объекта от того, что вы делаете с объектом. Когда вы создаете все свои объекты с помощью конструкторов, вы по существу жестко подключаете код, который использует объект для этой реализации. Код, который использует ваш объект, "зависит от" этого объекта. Это может показаться не большой проблемой на поверхности, но когда объект изменяется (подумайте об изменении подписи конструктора или подклассифицируя объект), вы должны вернуться и переделать вещи повсюду.
Сегодня фабрики в основном отшлифованы в пользу использования инъекции зависимостей, потому что они требуют большого количества кода котельной, который оказывается немного трудным для поддержания себя. Инъекция зависимостей в основном эквивалентна фабрикам, но позволяет указать, как ваши объекты соединяются декларативно (через конфигурацию или аннотации).
Ответ 7
Если конструктор класса является закрытым, вы не можете создать объект для класса извне.
class Test{
int x, y;
private Test(){
.......
.......
}
}
Мы не можем создать объект над классом извне. Таким образом, вы не можете получить доступ к x, y извне класса. Тогда в чем смысл этого класса?
Вот решение: FACTORY.
Включите метод ниже в класс выше
public static Test getObject(){
return new Test();
}
Итак, теперь вы можете создать объект для этого класса извне. Как и путь...
Test t = Test.getObject();
Статический метод, возвращающий объект класса путем выполнения его частного конструктора, называется FACTORY method
.
Ответ 8
Я думал, что добавлю немного света к этому сообщению о том, что знаю. Мы широко использовали эту технику в нашем recent android project
. Вместо creating objects using new operator
вы также можете использовать static method
для создания экземпляра класса. Список кодов:
//instantiating a class using constructor
Vinoth vin = new Vinoth();
//instantiating the class using static method
Class Vinoth{
private Vinoth(){
}
// factory method to instantiate the class
public static Vinoth getInstance(){
if(someCondition)
return new Vinoth();
}
}
Статические методы поддерживают создание условных объектов. Каждый раз, когда вы вызываете конструктор, объект будет создан, но вы можете этого не захотеть. предположим, что вы хотите проверить какое-то условие только тогда, когда хотите создать новый объект. Вы не будете создавать новый экземпляр Vinoth каждый раз, если ваше условие не будет удовлетворено.
Другой пример, взятый из Эффективной Java.
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
Этот метод переводит булево примитивное значение в логическую ссылку на объект. Метод Boolean.valueOf(boolean)
показывает нам, он никогда не создает объект. Способность static factory methods
возвращать один и тот же объект из повторения invocations
позволяет классам поддерживать строгий контроль над тем, какие экземпляры существуют в любое время.
static factory methods
заключается в том, что в отличие от constructors
они могут возвращать object
любого subtype
своего возвращаемого типа. Одно применение этой гибкости заключается в том, что API может возвращать объекты, не открывая их классы. Скрытие классов реализации таким образом приводит к очень компактному API.
Calendar.getInstance() - отличный пример для вышеизложенного, он создается в зависимости от локали a BuddhistCalendar
, JapaneseImperialCalendar
или по умолчанию один Georgian
.
Другим примером, который я мог бы подумать, является Singleton pattern
, где вы создаете частные конструкторы, создавая собственный метод getInstance
, где вы убедитесь, что всегда доступен только один экземпляр.
public class Singleton{
//initailzed during class loading
private static final Singleton INSTANCE = new Singleton();
//to prevent creating another instance of Singleton
private Singleton(){}
public static Singleton getSingleton(){
return INSTANCE;
}
}
Ответ 9
A factory метод, который абстрагирует создание объекта. Обычно фабрики полезны, когда вы знаете, что вам нужен новый экземпляр класса, который реализует какой-либо интерфейс, но вы не знаете класс реализации.
Это полезно при работе с иерархиями связанных классов, хорошим примером этого может служить инструментарий GUI. Вы могли бы просто запрограммировать вызовы конструкторам для конкретных реализаций каждого виджета, но если вы когда-нибудь захотите обменять один инструментарий на другой, у вас будет много мест для изменения. Используя factory, вы уменьшите количество кода, который вам нужно изменить.
Ответ 10
Одно из преимуществ Static factory заключается в том, что API может возвращать объекты, не открывая классы. Это приводит к очень компактному API. В java это достигается классом Collections, который скрывает около 32 классов, что делает его API коллекции очень компактным.
Ответ 11
Статический метод factory хорош, если вы хотите, чтобы только один экземпляр возвращал конкретный класс, который будет использоваться.
Например, в классе подключения к базе данных может потребоваться, чтобы только один класс создавал соединение с базой данных, поэтому, если вы решили переключиться с Mysql на Oracle, вы можете просто изменить логику в одном классе, а остальная часть приложение будет использовать новое соединение.
Если вы хотите внедрить пул баз данных, это также будет сделано без влияния на остальную часть приложения.
Он защищает остальную часть приложения от изменений, которые вы можете внести в factory, что является целью.
Причиной статического является то, что если вы хотите отслеживать некоторый ограниченный ресурс (количество соединений сокетов или дескрипторов файлов), тогда этот класс может отслеживать, сколько из них было передано и возвращено, t исчерпал ограниченный ресурс.
Ответ 12
статическая
Член, объявленный с ключевым словом "static".
factory методы
Способы создания и возврата новых объектов.
в Java
Язык программирования относится к значению "статический", но не к определению "factory".
Ответ 13
Java-реализация содержит классы утилит java.util.Arrays и java.util.Collections, которые содержат статические factory методы, его примеры и способы использования:
-
Arrays.asList("1","2","3")
-
Collections.synchronizedList(..), Collections.emptyList(), Collections.unmodifiableList(...)
(Только некоторые примеры могут проверять javadocs для примеров методов mor https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html)
Также класс java.lang.String имеет такие статические factory методы:
-
String.format(...), String.valueOf(..), String.copyValueOf(...)