Проще говоря, что такое фабрика?

Что такое фабрика и зачем мне ее использовать?


person Community    schedule 26.09.2011    source источник
comment
Абстрактный узор фабрики   -  person Prince John Wesley    schedule 26.09.2011
comment
Существует 2 различных типа шаблона фабрики: шаблон фабричного метода и шаблон абстрактной фабрики. Что вы имеете в виду?   -  person Buhake Sindi    schedule 26.09.2011


Ответы (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 и т. Д.).

Смотрите также:

person BalusC    schedule 26.09.2011

Шаблон проектирования 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.

person eabraham    schedule 04.04.2012
comment
вверх для простого для понимания примера - person Rashim Catalan Dhaubanjar; 14.12.2017

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

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

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

person Saket    schedule 26.09.2011
comment
+1: Factory также можно использовать, когда класс может быть выведен, но другие детали, такие как аргументы конструктора, скрыты. Фабрика создает объект, при этом вызывающей стороне этой фабрики не нужно знать какие-либо подробности о том, как это делается. - person Peter Lawrey; 26.09.2011

Что такое фабрика?

Википедия подробно объясняет

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

Зачем мне его использовать?

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

person Shahzeb    schedule 26.09.2011

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

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

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

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

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

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

Шаблоны проектирования: фабрика против фабричного метода против абстрактной фабрики

Что является основным разница между фабричным паттерном и абстрактным фабричным паттерном?

person Ravindra babu    schedule 28.09.2016