Проще говоря, что такое фабрика? - PullRequest
35 голосов
/ 26 сентября 2011

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

Ответы [ 6 ]

38 голосов
/ 26 сентября 2011

Вы знакомы с 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» на «Сервер приложений Java EE» (WildFly, TomEE, GlassFish, Liberty и т. Д.).

См. Также:

24 голосов
/ 26 сентября 2011

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

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

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

22 голосов
/ 04 апреля 2012

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

5 голосов
/ 26 сентября 2011

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

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

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

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

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

3 голосов
/ 28 сентября 2016

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

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

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

posts:

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

В чем принципиальная разница между Фабричными и Абстрактными Фабричными шаблонами?

3 голосов
/ 26 сентября 2011

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

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