14 ответов:
мы избегаем предоставления прямого доступа к подключениям к базе данных, потому что они ресурсоемкие. Поэтому мы используем статический метод фабрики
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); //... } }
The статический метод фабрики шаблон это способ инкапсуляции создания объекта. Без заводского метода вы просто вызовете класс конструктор напрямую:
Foo x = new Foo(). С помощью этого шаблона вы бы вместо этого вызвали заводской метод:Foo x = Foo.create(). Конструкторы помечены как частные, поэтому они не могут быть вызваны иначе как из класса, а метод factory помечен какstaticтак что это можно назвать без объект.есть несколько преимуществ этой модели. Во-первых, фабрика может выбирать из многих подклассов (или исполнителей интерфейса) и возвращать их. Таким образом, вызывающий может указать желаемое поведение с помощью параметров, без необходимости знать или понимать потенциально сложную иерархию классов.
еще одним преимуществом является, как указывали Мэтью и Джеймс, контроль доступа к ограниченному ресурсу, такому как соединения. Это способ реализации бассейны объекты для повторного использования - вместо того, чтобы строить, использовать и сносить объект, если строительство и разрушение являются дорогостоящими процессами, может быть, имеет смысл построить их один раз и утилизировать их. Фабричный метод может возвращать существующий, неиспользуемый экземпляр объекта, если он имеет один, или построить один, если количество объектов ниже некоторого нижнего порога, или создать исключение или вернуть
nullесли это выше верхнего порога.в статье на Википедия, несколько заводских методов также позволяют по-разному интерпретировать подобные типы аргументов. Обычно конструктор имеет то же имя, что и класс, что означает, что вы можете иметь только один конструктор с заданным подпись. Фабрики не так ограничены, что означает, что вы можете иметь два разных метода, которые принимают одни и те же типы аргументов:
Coordinate c = Coordinate.createFromCartesian(double x, double y)и
Coordinate c = Coordinate.createFromPolar(double distance, double angle)это также может быть использовано для улучшения читаемости, как Расмус записи.
внимание! - Это статический метод фабрики и не то же, что и Метод Фабрики pattern " (c) эффективная Java, Джошуа блох.
метод фабрики: "определите интерфейс для создания объекта, но пусть классы, которые реализуют интерфейс, решают, какой класс создавать. Фабричный метод позволяет классу отложить создание экземпляра до подклассов " (c) GoF.
"статический метод фабрики-это просто статический метод, который возвращает экземпляр класса."с) эффективная Ява, Джошуа блох. Обычно этот метод находится внутри определенного класса.
разница:
ключевая идея статического метода фабрики состоит в том, чтобы получить контроль над созданием объекта и делегировать его от конструктора к статическому методу. Решение объекта, который будет создан, похоже на абстрактную фабрику, сделанную вне метода (в общем случае, но не всегда). Пока ключ (!) идея фабричного метода заключается в делегировании решения о том, какой экземпляр класса для создания внутри Заводского метода. Например, классическая реализация Синглтона является частным случаем статического метода фабрики. Пример обычно используемых статических методов фабрики:
- valueOf
- getInstance
- newInstance
читаемость может быть улучшена статическими методами фабрики:
сравнить
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();
- есть имена, в отличие от конструкторов, которые могут уточнить код.
- не нужно создавать новый объект при каждом вызове - объекты при необходимости можно кэшировать и использовать повторно.
- может возвращать подтип возвращаемого типа, в частности, могут возвращает объект, класс реализации которого неизвестен вызывающему объекту. Это очень ценное и широко используется во многих фреймворках которые используют интерфейсы в качестве возвращаемого типа статической фабрики методы.
все сводится к ремонтопригодности. Лучший способ поставить это всякий раз, когда вы используете
newключевое слово для создания объекта вы связываете код, который вы пишете, с реализацией.шаблон фабрики позволяет отделить способ создания объекта от того, что вы делаете с объектом. Когда вы создаете все свои объекты с помощью конструкторов, вы по существу жестко связываете код, который использует объект для этой реализации. Код, который использует ваш объект "зависит от" этого объекта. Это может показаться не очень важным на поверхности, но когда объект изменяется (подумайте об изменении подписи конструктора или подкласса объекта), вам нужно вернуться и перемонтировать вещи повсюду.
сегодня заводы в значительной степени были отброшены в сторону в пользу использования инъекции зависимостей, потому что они требуют много кода котельной плиты, который оказывается немного трудным для поддержания себя. Инъекция зависимостей в основном эквивалентна фабрики, но позволяет указать, как ваши объекты соединяются декларативно (через конфигурацию или аннотации).
если конструктор класса является частным, то вы не можете создать объект для класса из-за его пределов.
class Test{ int x, y; private Test(){ ....... ....... } }мы не можем создать объект для выше класса из-за его пределов. Таким образом, вы не можете получить доступ к x, y из-за пределов класса. Тогда какая польза от этого класса?
Вот ответ : завод метод.
Добавьте следующий метод в классpublic static Test getObject(){ return new Test(); }Так что теперь вы можете создать объект для этого класса извне его. Нравится...
Test t = Test.getObject();следовательно, статический метод, который возвращает объект класса путем выполнения его частного конструктора, называется завод метод
.
я думал, что добавлю немного света к этому сообщению о том, что я знаю. Мы широко использовали эту технику в нашей
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.календарь.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; } }
фабричный метод метод, который абстрагирует создание экземпляра объекта. Обычно фабрики полезны, когда вы знаете, что вам нужен новый экземпляр класса, который реализует некоторый интерфейс, но вы не знаете реализующий класс.
Это полезно при работе с иерархиями связанных классов, хорошим примером этого будет инструментарий GUI. Вы можете просто жестко закодировать вызовы конструкторов для конкретных реализаций каждого виджета, но если вы когда-либо хотели чтобы поменять один набор инструментов на другой, у вас будет много мест для изменения. Используя фабрику, вы уменьшаете объем кода, который вам нужно будет изменить.
одним из преимуществ статической фабрики является то, что API может возвращать объекты, не делая их классы общедоступными. Это приводит к очень компактному API. В java это достигается с помощью класса Collections, который скрывает около 32 классов, что делает его collection API очень компактным.
статический метод фабрики хорош, когда вы хотите гарантировать, что только один единственный экземпляр будет возвращать конкретный класс, который будет использоваться.
например, в классе подключения к базе данных вы можете захотеть, чтобы только один класс создавал соединение с базой данных, так что если вы решите переключиться с Mysql на Oracle, вы можете просто изменить логику в одном классе, а остальная часть приложения будет использовать новое соединение.
Если вы хотите реализовать объединение баз данных, то это также будет сделано без ущерба для остальной части приложения.
Он защищает остальную часть приложения от изменений, которые вы можете внести на завод, что является целью.
причина его статичности заключается в том, что если вы хотите отслеживать некоторый ограниченный ресурс (количество соединений сокетов или дескрипторов файлов), то этот класс может отслеживать, сколько было передано и возвращено, поэтому вы не исчерпываете ограниченный ресурс.
static
элемент, объявленный с ключевым словом 'static'.
методы фабрики
методы, которые создают и возвращают новые объекты.
в Java
язык программирования имеет отношение к значению "статический", но не к определению "фабрика".
реализация Java содержит классы утилит java.утиль.Массивы и java.утиль.Коллекции оба они содержат статические методы фабрики, примеры и как использовать :
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.ленг.Строка класс такой статические методы фабрики:
String.format(...), String.valueOf(..), String.copyValueOf(...)
одним из преимуществ статических методов фабрики с частным конструктором(создание объекта должно быть ограничено для внешних классов, чтобы гарантировать, что экземпляры не создаются извне) является то, что вы можете создать экземпляр-контролируемых классы. А классы, управляемые экземплярами, гарантируют, что не существует двух одинаковых различных экземпляров(a.равно(b) тогда и только тогда, когда a==b) во время работы программы это означает, что вы можете проверить равенство объектов с == оператор вместо равна метод, согласно эффективной java.
возможность статических заводских методов возвращать один и тот же объект из повторные вызовы позволяют классам поддерживать строгий контроль над какие экземпляры существуют в любое время. Классы, которые делают это, говорят, управляемый экземпляр. Есть несколько причин, чтобы написать классы, управляемые экземплярами. Управление экземпляром позволяет классу гарантия, что это синглтон (Пункт 3) или неустановляемый (пункт 4). Кроме того, это позволяет неизменяемому классу (пункт 15) сделать гарантию что не существует двух равных экземпляров: a. equals (b) тогда и только тогда, когда a==b. If класс делает эту гарантию, тогда его клиенты могут использовать оператор == вместо метода equals (Object), который может привести к улучшению спектакль. Перечисления типов (пункт 30) обеспечивают эту гарантию.
от эффективного Java, Джошуа блох (пункт 1,Страница 6)
Comments