Что такое фабрика и зачем мне ее использовать?
Проще говоря, что такое фабрика?
Ответы (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 переменной, которая может быть настроена извне (например, файл свойств) и написать ANSI-совместимые SQL-запросы, то вам никогда не придется переписывать, перекомпилировать, перестраивать и распространять ваше Java-приложение для каждого отдельного поставщика базы данных и / или драйвер JDBC, о котором знает мир. Вам просто нужно удалить нужный JAR-файл драйвера JDBC в пути к классам среды выполнения и предоставить конфигурацию с помощью некоторого файла (свойств) без необходимости изменять какую-либо строку кода Java всякий раз, когда вы хотите переключить БД или повторно использовать приложение в другой БД.
В этом сила интерфейсов и абстрактных фабрик.
Другой известный пример из реальной жизни - Java EE. Замените JDBC на Java EE и драйвер JDBC на сервер приложений 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 объекты createMale или createFemale Person.
Проще говоря, Factory - это объектно-ориентированный шаблон проектирования, который занимается созданием объектов без указания точного класса объекта, который должен быть создан.
Хорошая причина для его использования четко определена в википедии:
Создание объекта часто требует сложных процессов, которые нельзя включать в составной объект. Создание объекта может привести к значительному дублированию кода, может потребовать информации, недоступной для составляющего объекта, может не обеспечить достаточного уровня абстракции или может иным образом не быть частью проблем составляющего объекта. Шаблон проектирования фабричного метода решает эти проблемы, определяя отдельный метод для создания объектов, подклассы которого затем могут переопределить, чтобы указать производный тип продукта, который будет создан.
Что такое фабрика?
Википедия подробно объясняет
Также см. Ответ легендарного BalusC на здесь о многих примерах шаблонов GoF
Простыми словами Factory создает \ инициализирует \ выделяет объекты, которые вы можете использовать в коде.
например, если у вас есть человек абстрактный класс или интерфейс или даже конкретный класс, и вы объявляете его в другом классе, например private person;
это просто объект был объявлен, но не создан. Вы будете использовать либо новую, либо некоторую инъекцию зависимостей, либо фабрику для создания этого объекта (есть и другие варианты, например, локатор и т. Д.).
Зачем мне его использовать?
Теперь вам может потребоваться определенный тип человека, например, учитель или даже человек, который может иметь разные имплантации на основе разных конфигураций и т. Д. Заводской шаблон позаботится об этом. Он позволяет или, я бы сказал, освобождает вас от беспокойства о том, какая реализация или инициализация следует использовать конкретный класс.
Фабрика - это объект, который создает объекты. Обычное использование включает два случая:
- Если вы хотите делегировать выбор конкретного объекта фабрике - например, он может вернуть уже существующий объект (см.
Integer.valueOf()
, который является так называемым фабричным методом) или выбрать конкретную реализацию в зависимости от некоторых условий - например, предоставленный аргумент или предопределенные параметры (см. классXPathFactory
в Java API для Обработка XML) - Когда вам нужно больше гибкости для универсальной работы. Вы не можете передать метод или конструктор в качестве аргумента (ну, вы можете, но отражение - отстой), поэтому вы используете конкретную фабрику в качестве источника объекта (например,
SomeFactory<T>
в универсальном методе).
Factory - это объект для создания других объектов.
Он создает объекты, не открывая клиенту логику создания экземпляров.
Используйте этот шаблон, если вы не хотите раскрывать логику создания экземпляра объекта клиенту / вызывающему
Похожие сообщения:
Шаблоны проектирования: фабрика против фабричного метода против абстрактной фабрики
Что является основным разница между фабричным паттерном и абстрактным фабричным паттерном?