Проще говоря, что такое фабрика?
Что такое фабрика и почему я хочу ее использовать?
6 ответов
Вы знакомы с JDBC? Это одна и вся (абстрактная) фабрика. Это хороший пример из реальной жизни.
// Factory method. Loads the driver by given classname. It actually returns a
// concrete Class<Driver>. However, we don't need it here, so we just ignore it.
// It can be any driver class name. The MySQL one here is just an example.
// Under the covers, it will do DriverManager.registerDriver(new Driver()).
Class.forName("com.mysql.jdbc.Driver");
// Abstract factory. This lets the driver return a concrete connection for the
// given URL. You can just declare it against java.sql.Connection interface.
// Under the covers, the DriverManager will find the MySQL driver by URL and call
// driver.connect() which in turn will return new ConnectionImpl().
Connection connection = DriverManager.getConnection(url);
// Abstract factory. This lets the driver return a concrete statement from the
// connection. You can just declare it against java.sql.Statement interface.
// Under the covers, the MySQL ConnectionImpl will return new StatementImpl().
Statement statement = connection.createStatement();
// Abstract factory. This lets the driver return a concrete result set from the
// statement. You can just declare it against java.sql.ResultSet interface.
// Under the covers, the MySQL StatementImpl will return new ResultSetImpl().
ResultSet resultSet = statement.executeQuery(sql);
Вам не нужно иметь отдельную строку конкретного драйвера JDBC import
в вашем коде. Вам не нужно делать import com.mysql.jdbc.ConnectionImpl
или что-то. Вы просто должны все заявить против java.sql.*
, Вам не нужно делать connection = new ConnectionImpl();
сам. Вы просто должны получить его из абстрактной фабрики как часть стандартного API.
Если вы зададите имя класса драйвера JDBC как переменную, которую можно настраивать извне (например, файл свойств), и будете писать SQL-запросы, совместимые с ANSI, вам больше не нужно будет переписывать, перекомпилировать, перестраивать и перераспределять приложение Java для каждого отдельного поставщика базы данных и / или драйвер JDBC, о котором знает мир. Вам просто нужно удалить нужный JAR-файл драйвера JDBC в пути к классам среды выполнения и предоставить конфигурацию с помощью некоторого файла (свойств) без необходимости изменять какую-либо строку кода Java всякий раз, когда вы хотите переключить БД или повторно использовать приложение в другой БД.
В этом сила интерфейсов и абстрактных фабрик.
Другой известный пример из реальной жизни - Java EE. Замените "JDBC" на "Java EE" и "JDBC driver" на "Сервер приложений Java EE" (WildFly, TomEE, GlassFish, Liberty и т. Д.).
Смотрите также:
- Как именно
Class#forName()
а такжеDriverManager#getConnection()
Работа? - Что такое Java EE?
- Википедия: Шаблон фабричного метода
- Википедия: Абстрактный шаблон фабрики
Шаблон проектирования Factory идеален в тех случаях, когда вам необходимо создать несколько экземпляров объекта во время выполнения. Вместо явного создания каждого экземпляра вы можете инициализировать множество экземпляров. Кроме того, вы можете инкапсулировать сложный код создания, который можно использовать многократно.
Пример:
public class Person {
int ID;
String gender;
public Person(int ID,String gender){
this.ID=ID;
this.gender=gender;
}
public int getID() {
return ID;
}
public String getGender() {
return gender;
}
}
public class PersonFactory{
public static Person createMale(int id){
return new Person(id,"M");
}
public static Person createFemale(int id){
return new Person(id,"F");
}
}
public class factorytest{
public static void main(String[]args){
Person[] pList= new Person[100];
for(int x=0;x<100;x++){
pList[x]=PersonFactory.createMale(x);
}
}
}
В этом примере мы инкапсулируем детали параметра инициализации пола и можем просто попросить PersonFactory создать объекты PersonMale или createFemale.
Проще говоря, Factory - это шаблон проектирования ОО, который имеет дело с созданием объектов без указания точного класса объекта, который должен быть создан.
Хорошая причина его использования хорошо определена в википедии:
Создание объекта часто требует сложных процессов, которые не следует включать в составной объект. Создание объекта может привести к значительному дублированию кода, может потребовать информацию, недоступную для объекта-составителя, может не обеспечить достаточный уровень абстракции или иным образом не может быть частью проблем объекта-составителя. Шаблон проектирования фабричного метода решает эти проблемы путем определения отдельного метода для создания объектов, которые затем можно переопределить, чтобы указать производный тип создаваемого продукта.
Что такое фабрика?
Википедия объясняет подробно
Также посмотрите ответ от легендарного BalusC здесь о многих примерах паттернов GoF
Проще говоря, Factory создает \initialize\allocate объекты, которые вы можете использовать в коде.
например, если у вас есть личный абстрактный класс или интерфейс или даже конкретный класс, и вы объявляете его в другом классе, например private person;
это только тот объект, который был объявлен, но не создан. Для создания этого объекта вы будете использовать либо новую, либо некоторую инъекцию зависимостей, либо фабрику (есть и другие варианты, например, локатор и т. Д.).
Почему я хотел бы использовать один?
Теперь вам может понадобиться особый тип человека, например, учитель или даже человек могут иметь разные имплантации, основанные на разных конфигурациях и т. Д. Заводской паттерн позаботится об этом. Он позволяет вам или должен сказать, освобождает вас от беспокойства о том, какая реализация или инициализация конкретный класс должен быть использован.
Фабрика - это объект для создания других объектов.
Он создает объекты, не раскрывая логику реализации клиенту.
Используйте этот шаблон, если вы не хотите раскрывать логику создания объекта клиенту / вызывающей стороне.
Похожие сообщения:
Шаблоны проектирования: фабрика против фабрики, метод против абстрактной фабрики
В чем принципиальная разница между фабричными и абстрактными фабричными моделями?
Фабрика - это объект, который создает объекты. Общее использование включает два случая:
- Если вы хотите делегировать выбор конкретного объекта на завод - например, он может вернуть уже существующий объект (см.
Integer.valueOf()
, который является так называемым фабричным методом) или выберите конкретную реализацию в зависимости от некоторых условий - например, предоставленный аргумент или предварительно определенные параметры (см.XPathFactory
класс в Java API для обработки XML) - Когда вы хотите больше гибкости для какой-то универсальной работы. Вы не можете передать метод или конструктор в качестве аргумента (ну, вы можете, но отражение - отстой), поэтому вы используете конкретную фабрику в качестве источника объекта (например,
SomeFactory<T>
в общем методе).