Что'ы и "статическая фабрика, и" способ?
В статический метод фабрики шаблон - это способ инкапсулировать создание объектов. Без фабричный метод, вы бы просто вызвать класс'ы конструктор напрямую: Фу х = новые функции foo()
. С этой картины, ты бы вместо этого вызвать метод фабрики: Фу х = Фу.создать()
. Конструкторы, помеченные как личные, поэтому их нельзя назвать исключением из класса, и фабричный метод помечен как [статический
][3], так что его можно вызывать без объекта.
Есть несколько преимуществ этой модели. Одна заключается в том, что завод может выбрать из множества подклассов (или реализация интерфейса) и вернет его. Таким образом, абонент может указать желаемого поведения через параметры, без необходимости знать или понимать потенциально сложные иерархии классов.
Еще одним преимуществом является, как Мэтью и Джеймс уже отмечали, управление доступом к ограниченным ресурсом, таких как соединения. Этот способ реализации бассейны многократно используемые объекты - вместо строительства, использования и сноса объекта, если строительство и разрушение являются дорогостоящими процессами, это может сделать больше смысла после того, как построить их и переработать их. Фабричный метод может возвращать существующий, неиспользуемый объект, если он имеет один, или построить один, если количество объектов ниже нижнего порога, или бросать исключение или возвращать значение NULL, если он's выше верхнего порога.
Согласно статье на Википедии, несколько фабричных методов также допускать различные толкования подобных типов аргументов. Обычно конструктор имеет такое же имя, как и класс, который означает, что вы можете иметь только один конструктор с заданным подпись. Заводы не так ограничены, что означает, что вы можете иметь два различных метода, которые принимают те же типы аргументов:
Coordinate c = Coordinate.createFromCartesian(double x, double y)
и
Coordinate c = Coordinate.createFromPolar(double distance, double angle)
Это также может быть использован для улучшения читабельности, как Rasmus ноты.
[3]: http://en.wikipedia.org/wiki/Method_(вычислительная_техника) Static_methods#
Внимание! "в статический метод фабрики, это НЕ же фабричный метод план глаз" (с) эффективная Java Джошуа блох.
Способ завода: "и определить интерфейс для создания объекта, но позвольте классы, которые реализуют интерфейс решите, какой класс инстанцировать. Фабричный метод позволяет классу отложить инстанцирование подклассам и" (с) Гоф.
на "статический метод фабрики-это просто статический метод, который возвращает экземпляр класса.&и" (с) эффективная Java Джошуа блох. Обычно этот метод находится внутри определенного класса.
Разница:
Ключевая идея статический фабричный метод-это получить контроль над созданием объекта и делегировать его из конструктора статического метода. Решения создаваемого объекта, как в абстрактном заводе изготавливаются вне метода (в общем случае, но не всегда). В то время как ключ (!) идея метода фабрики является делегирование решение, что экземпляр класса создать внутри метода-фабрики. Е. Г. классическая реализация Синглтон-это особый случай статический метод фабрики. Пример часто используемые статические методы фабрики:
Мы не обеспечивая прямой доступ к подключения к базе данных, потому что они'вэ ресурсов. Поэтому мы используем статический метод фабрики 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);
//...
}
}
Читаемость может быть улучшена с помощью статических методов фабрики:
Сравнить
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();
- имеют имен, в отличие от конструкторов, которые могут уточнить код.
- не нужно создавать новый объект при каждом вызове - объекты можно кэшировать и использовать повторно, если это необходимо.
- возвращает подтип возвращаемого типа, в частности, могут возвратить объект реализации, класс которого неизвестен звонящего. Это очень ценное и широко используется во многих фреймворках что использование интерфейсов в качестве возвращаемого типа статических методов фабрики.
Все это сводится к ремонтопригодности. Лучший способ положить это всякий раз, когда вы использовать новые
ключевое слово, чтобы создать объект, вы'повторное соединение код, который вы'вновь пишет на реализацию.
Шаблон фабрика позволяет разделить, как вы создаете объект из того, что вы делаете с объектом. При создании всех объектов использование конструкторов, вы, по сути, жесткой привязки код, который использует объект к реализации. Код, который использует ваш объект, есть "зависит", что объект. Это может не походить на грандиозное предприятие, но когда объект изменения (думаю, что изменения подпись конструктора или создание подклассов объекта) вы должны вернуться и Rewire вещи везде.
Сегодня заводы были в основном отмел в пользу использования внедрения зависимостей, потому что они требуют много котел-плита код, который окажется немного трудно, чтобы сохранить себя. Внедрение зависимостей является в основном эквивалентом фабрики, но можно указать, какие объекты вам проводным декларативно вместе (через настройки или аннотации).
Если конструктор класса-это личное, то нельзя создать объект класса извне.
class Test{
int x, y;
private Test(){
.......
.......
}
}
Мы не можем создать объект на класс выше, так и вне ее. Поэтому вы не можете открыть x, y из вне класса. Тогда какая польза от этого класса? <БР/> Вот ответ : <б>фабрика</б> метод.<БР/> Добавьте следующий метод в класс выше <БР/>
public static Test getObject(){
return new Test();
}
Итак, теперь вы можете создать объект этого класса извне. Как кстати...
Test t = Test.getObject();
Таким образом, статический метод, который возвращает объект класса, выполняя собственный конструктор называется <б>фабрика</б> метод<БР/>.
Я думал, что я добавлю немного света на этот пост на то, что я знаю. Мы использовали этот метод широко в последние проект Наши андроид
. Вместо создания объектов с помощью оператора new` вы также можете использовать статический метод для создания экземпляра класса. Листинг кода:
//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();
}
}
Статические методы поддержки условный объект создания: каждый раз, когда вы вызываете конструктор объект будет создан, но вы не хотите этого. предположим, вы хотите проверить какое-либо условие, только тогда вы хотите создать новый объект.Вы не будет создавать новый экземпляр обновить каждый раз, если ваше условие выполнено.
Другой пример взят из эффективная Java.
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
Этот метод преобразует логическое значение примитивное значение в булево ссылка на объект. В Булево.метод valueOf(логическое)
иллюстрирует нам, он не создает объект. Способность статические методы фабрики, чтобы возвратить тот же самый объект от повторных
вызовы` позволяет классов осуществлять строгий контроль над тем, что существуют случаи, в любое время.
Статические методы фабрики является то, что в отличие от конструкторов, они смогут вернуть
объектлюбой
подвид` их тип возврата. Одно применение эта гибкость заключается в том, что API может возвращать объекты, не делая их публичных классов. Скрывая классов реализации в этой моды приводит к очень компактный API-интерфейс.
Календарь.деыпзьапсе() это отличный пример для вышесказанного, создает в зависимости от локали, а BuddhistCalendar,
JapaneseImperialCalendar или по умолчанию один "грузинский".
Другой пример, который я мог думать, это паттерн Singleton, где вы делаете ваши конструкторы частная создавать собственные
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;
}
}
Фабричный метод метод, который абстрагирует инстанцировании объекта. Как правило, заводы полезно, когда вы знаете, что вам нужен новый экземпляр класса, реализующего некоторый интерфейс, но вы не'т знаю, что класс исполнителей.
Это полезно при работе с иерархиями классов, хорошим примером этого может быть графический инструментарий. Вы можете просто жестко закодировать вызовы конструкторов для конкретных реализаций каждого виджета, но если вы когда-нибудь хотели заменить один инструментарий для друга вы'd имеют много места для изменения. С помощью фабрики можно уменьшить количество кода, который нужно изменить.
Одно из преимуществ, которое вытекает из статической фабрики заключается в том, что API может возвращать объекты, не делая их публичных классов. Это привело к очень компактный API-интерфейс. В Java это достигается за счет класса коллекции, который прячется около 32 класса, что делает его API набор очень компактный.
Статический фабричный метод хорош, когда вы хотите гарантировать, что только один экземпляр собирается вернуться в класс бетона, который будет использоваться.
Например, в базе данных, подключения класса, вы можете иметь только один класс создать подключение к базе данных, так что если вы решили перейти с MySQL на Oracle, вы можете просто изменить логику в один класс, а остальные приложения будут использовать новое подключение.
Если вы хотите реализовать объединение баз данных, что бы потом быть сделано без ущерба для остальной части приложения.
Он защищает остальные приложения от изменений, которые вы можете сделать на завод, который является целью.
Причина для того, чтобы быть статическим, если вы хотите, чтобы отслеживать, какой ограниченный ресурс (кол-во подключений или дескрипторы файлов), то этот класс может отслеживать, сколько уже прошел и вернулся, так что вы Дон'т исчерпать ограниченный ресурс.
статический
Член, объявленный с ключевым словом 'статический'.
методы фабрики
Методы, которые создают и возвращают новые объекты.
В языке Java
Язык программирования имеет отношение к смыслу 'статический' но не к определению 'фабрика'.
Реализация Java содержит классы, коммунальные услуги Ява.утиль.Массивы и Ява.утиль.Сборники оба из них содержит статические методы фабрики, примеры и как использовать :
Массивы.asList (на"1" В, С"2" В, С"3", у)
Коллекции.synchronizedList(..), сборники.emptyList(), сборники.unmodifiableList (...) (только некоторые примеры, можно проверить javadocs для методов Мор примеры https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html)
Также Ява.яз.Строки класс такой статические методы фабрики:
Одним из преимуществ статические методы фабрики с собственным конструктором(создание объекта должно быть ограничено для внешних классов, чтобы убедиться, экземпляры не создаются извне) заключается в том, что вы можете создать экземпляр контролируемые классы. И экземпляр-контролируемые классы гарантирует, что нет двух одинаковых отдельных экземпляров существует(а.метод Equals(B), если и только если А==Б) во время программы выполняется, что означает, что вы можете проверить равенство объектов с == опе, а не составляет метод, в соответствии с действующим Ява.
способность статические методы фабрики, чтобы возвратить тот же самый объект от повторные вызовы позволяет классов осуществлять строгий контроль за какие имеются экземпляры в любое время. Классы, которые делают это, говорят, экземпляр-контролем. Есть несколько причин для написания экземпляр-контролируемые классы. Экземпляр управления позволяет классу гарантия, что оно является одноэлементным (пункт 3) или noninstantiable (пункт 4). кроме того, он позволяет неизменяемый класс (пункт 15), чтобы гарантировать что нет двух одинаковых экземпляров существует:.равна(B), если и только если А==Б. Если класс делает эту гарантию, то ее клиенты могут использовать == оператора вместо метода Equals(Object) метод, который может привести к улучшению производительность. Типов enum (пункт 30) обеспечить эту гарантию.
От эффективная Java Джошуа блох(пункт 1,стр. 6)