Проще говоря, что такое factory?

Что такое factory и почему я хочу использовать его?

Ответ 1

Вы знакомы с JDBC? Это один и все (аннотация) factory. Это хороший пример в реальном мире.

// 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(); самостоятельно. Вам просто нужно получить его из абстрактного factory как часть стандартного API.

Если имя класса драйвера JDBC является переменной, которую можно настроить извне (например, файл свойств) и писать ANSI-совместимые SQL-запросы, тогда вам не потребуется переписывать, перекомпилировать, перестраивать и распространять ваше приложение Java для каждого отдельного поставщика базы данных и/или драйвера JDBC, о котором знает мир. Вам просто нужно отбросить JAR файл JDBC-драйвера в пути к среде выполнения и предоставить конфигурацию некоторым (свойствам) файла без необходимости изменять любую строку кода Java всякий раз, когда вы хотите переключать БД или повторно использовать приложение в другой БД.

Это сила интерфейсов и абстрактных фабрик.

Другим известным примером реального мира является Java EE. Замените "JDBC" на "Java EE" и "драйвер JDBC" на "сервер приложений Java EE" (WildFly, TomEE, GlassFish, Liberty и т.д.).

См. также:

Ответ 2

Простыми словами Factory является шаблоном проектирования OO, который имеет дело с созданием объектов без указания точного класса объекта, который должен быть создан.

Хорошая причина для его использования четко определена в wikipedia:

Создание объекта часто требует сложных процессов, а не которые необходимо включить в составной объект. Объект создание может привести к значительному дублированию кода, может потребоваться информация, недоступная композиционному объекту, может не предоставлять достаточный уровень абстракции или иначе не может быть частью составляющие объекты. Образцы дизайна метода factory обрабатываются эти проблемы путем определения отдельного метода для создания объектов, какие подклассы могут затем переопределить, чтобы указать производный тип продукт, который будет создан.

Ответ 3

Конструктивный шаблон 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.

Ответ 4

Что такое factory?

Wikipedia подробно объясняет

Также см. ответ от легендарного BalusC над здесь о многих примерах образцов GoF
Простыми словами factory создает \initialize\allocate объекты, которые вы можете использовать в коде. Например, если у вас есть абстрактный класс или интерфейс человека или даже конкретный класс, и вы объявляете его в другом классе, например. private person; Это просто тот объект, который был объявлен, но не создан. Вы будете использовать новую или некоторую инъекцию зависимостей или factory для создания этого объекта (есть и другие параметры, например, Locator и т.д.).

Почему я хочу использовать его?

Теперь вам может понадобиться конкретный тип лица, например, учитель или даже человек может иметь другую имплантацию, основанную на разных конфигурациях и т.д. Законодательная картина позаботится об этом. Она позволяет вам или мне сказать, освобождает вас от беспокойства о том, какая реализация или инициализация определенного класса.

Ответ 5

factory - объект, который создает объекты. Общее использование включает в себя два случая:

  • Если вы хотите делегировать выбор конкретного объекта factory - например, он может вернуть уже существующий объект (см. Integer.valueOf(), который является так называемым методом factory) или выбрать конкретную реализацию в зависимости от некоторых условий - например, (см. XPathFactory class в Java API для обработки XML)
  • Если вам нужна дополнительная гибкость для какой-либо универсальной работы. Вы не можете передать метод или конструктор в качестве аргумента (ну, вы можете, но отражение отстой), поэтому вы используете конкретный factory как источник объекта (например, SomeFactory<T> в общем методе).

Ответ 6

Factory - это объект для создания других объектов.

Он создает объекты, не подвергая клиентскую логику создания экземпляра.

Используйте этот шаблон, если вы не хотите подвергать логику экземпляра объекта клиенту/вызывающему

Похожие сообщения:

Шаблоны проектирования: Factory vs Factory метод vs Аннотация Factory

В чем основное отличие шаблонов Factory и Abstract Factory?