1 / 1 / 2
Регистрация: 11.02.2014
Сообщений: 97

Фабричный метод

12.01.2016, 19:47. Показов 1674. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер. Заранее извиняюсь за создание темы о паттерне в этом разделе (в соответствующем разделе видел похожие темы но для php, в котором я ни бум бум).

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

код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
interface PC{
    public void print();
}
 
class LapTop implements PC{
 
    @Override
    public void print() {
        System.out.println("LapTop");
        
    }
    
}
 
class NoteBook implements PC{
 
    @Override
    public void print() {
        System.out.println("NoteBook");
        
    }
    
}
 
interface Factory{
    public PC create();
}
 
 
class LapTopFactory implements Factory{
    public PC create(){
        return new LapTop();
 
    }
}
 
class NoteBookFactory implements Factory{
    public PC create(){
        return new NoteBook();
 
    }
}
 
public class Main {
 
    public static void main(String[] args) {
        //Вариант 1. С фабрикой.
Factory factory=new LapTopFactory();//new NoteBookFactory();
PC pc=factory.create();
pc.print();
 
        //Вариант 2. Без фабрики.
//PC pc=new LapTop();//new NoteBook();
//pc.print();
 
    }
 
}
Вопрос такой: Какой смысл вообще создавать фабрику (вариант 1) если просто можно сделать как во втором варианте. Заранее спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.01.2016, 19:47
Ответы с готовыми решениями:

Паттерн фабричный метод
Нужно в C# привести пример работы паттерна фабричный метод. Выручайте, желательно готовый код, чтобы копипастом работало все. Нету...

Фабричный метод и RAII
У меня возник вопрос, как реализовать фабричный метод чтобы он соответствовал идиомы raii. Кто в данном случае является ответственным за...

Фабричный метод и паттерн фабрика
подскажите в чем разница увидел пример фабричного метода не понял его public MyClass Factory(int i, int j) { MyClass t =...

12
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
12.01.2016, 20:16
Смысл в том что вы делегируете создание объекта другому классу. Это повышает модульность программы и следовательно облегчает её поддержку. В данном примере практической пользы конечно же никакой но это всего лишь демонстрация
1
 Аватар для Lumber
345 / 141 / 51
Регистрация: 02.12.2015
Сообщений: 333
13.01.2016, 06:43
Фабрика нужна чтобы можно было определять тип создаваемого объекта динамически, в момент исполнения. Когда создание через new приходится сразу прописать имя конкретного класса и изменить без перекомпиляции это нельзя.

Допустим есть алгоритм который создаёт некую сложную структуру из множества объектов одного класса. Если использовался new, то чтобы создать такую же структуру из объектов другого класса придётся внести изменения в код этого алгоритма.

А можно создавать новые объекты через фабрику, и фабрику передавать в алгоритм как параметр. Тогда не меняя код реализующий этот алгоритм мы можем использовать его чтобы создавать структуры данных из объектов других классов.
0
1 / 1 / 2
Регистрация: 11.02.2014
Сообщений: 97
13.01.2016, 14:21  [ТС]
Lumber, Где здесь динамически если у каждой фактори-метода реализация только одного класса?
Java
1
Factory factory=new LapTopFactory();
здесь же нельзя динамически перейти к NoteBookFactory
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
13.01.2016, 15:08
Цитата Сообщение от Lumber Посмотреть сообщение
Фабрика нужна чтобы можно было определять тип создаваемого объекта динамически
ТС не спрашивает про Фабрику. Он спрашивает про Фабричный Метод. Это разные шаблоны.
0
 Аватар для Lumber
345 / 141 / 51
Регистрация: 02.12.2015
Сообщений: 333
13.01.2016, 15:23
Выбор типа происходит динамически вот здесь:
Java
1
PC pc=factory.create();
откуда появилась фабрика в данном примере неважно. Её могли бы например передать в качестве параметра. Пример демонстрирует реализацию, а не применение.

Добавлено через 6 минут
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
ТС не спрашивает про Фабрику
отвечаю вот на этот вопрос: "Какой смысл вообще создавать фабрику".
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
13.01.2016, 17:54
Цитата Сообщение от Lumber Посмотреть сообщение
Какой смысл вообще создавать фабрику
думаю он просто разницу не знает =)
0
0 / 0 / 0
Регистрация: 25.05.2017
Сообщений: 3
25.05.2017, 05:49
Я вот тоже не понимаю. В чем разница - к конкретному застройщику мы обращаемся по имени. Так и к создаваемому объе кту можем по имени обратиться. Где выгода ?
C#
1
2
3
4
5
6
7
8
9
10
Developer dev = new PanelDeveloper("ООО КирпичСтрой");
House house2 = dev.Create(); //создастся объект PanelHouse
         
dev = new WoodDeveloper("Частный застройщик");
House house = dev.Create(); //создастся объект WoodHouse
 
//Чем это лучше, чем если мы сразу создадим объекты нужных домов ??
 
House house3= new PanelHouse();
House house4= new WoodHouse();
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
25.05.2017, 08:45
погуглить то, конечно не судьба http://www.javenue.info/post/17
0
0 / 0 / 0
Регистрация: 25.05.2017
Сообщений: 3
25.05.2017, 12:18
Спасибо конечно, но похоже на очередную ссылку на описание фабричн метода. Где там ответ на мой вопрос - вот это ?? -
". Это позволяет использовать в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне." К сожалению , это мало о чем говорит мне.
ООП на практике не применял. Как именно это все работает - более-менее понятно. Про полиморфизм и создание экземпляров, приведённых к базовому типу для унифицированной работы с разными дочерними объектами, я вкурсе.
Но , мой вопрос выше, увы, остаётся в силе. Все равно мы создаём экземпляры классов, создающих объекты, чем это лучше, что мы создавали бы сами объекты...
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
25.05.2017, 12:22
Начни спринг изучать
0
 Аватар для Lumber
345 / 141 / 51
Регистрация: 02.12.2015
Сообщений: 333
25.05.2017, 13:57
Цитата Сообщение от user3435 Посмотреть сообщение
Я вот тоже не понимаю. В чем разница - к конкретному застройщику мы обращаемся по имени. Так и к создаваемому объекту можем по имени обратиться. Где выгода ?
House может создаваться внутри какого-то класса, а Developer передаваться в качестве параметра в конструктор. И тогда один и тот же класс в зависимости от параметра конструктора сможет создавать разные типы House. А если создавать через new, то только один тип который будет определяться при компиляции.

Например можно создать класс "Поселок" и в зависимости от типа переданного ему в конструктор Developer'а он будет застраиваться деревянными или панельными домами. И можно будет создавать новые типы Developer'ов и создавать поселки из других типов домов не переделывая сам класс "Поселок".
2
0 / 0 / 0
Регистрация: 25.05.2017
Сообщений: 3
25.05.2017, 14:43
Спасибо! Кстати да, в примерах уже с Абстрактной фабрикой, я помню, там как раз класс-строитель подавался как параметр конструктору класса Client.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.05.2017, 14:43
Помогаю со студенческими работами здесь

Фабричный метод: для чего он нужен?
Допустим есть такой код: #include <iostream> using std::cout; class Nature{ public: virtual void info() = 0; ...

Отличие паттернов Фабричный метод и Абстрактная фабрика
Правильно ли я понимаю, что отличие паттернов Фабричный метод и Абстрактная фабрика заключается в том, что в последнем присутствует тип,...

Как работать с коллекцией через Фабричный метод
Всем привет, я попробовал реализовать Фабричный метод Вот что получилось Класс продукт, там 1 абстрактный класс и 2 конкретных ...

Фабричный метод, хочу уточнить один момент
Начал изучать паттерны, первым стал фабричный метод. У меня возник такой вопрос: неужели фабричный метод обязательно должен НЕ отдавать...

Как реализовать версионность для rest api при посредстве паттерна фабричный метод?
Думаю как красиво написать rest api на php. Пытаюсь реализовать версионность. Вычитал, что надо для каждой версии создавать свою модель при...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

Новые блоги и статьи
Популярные LM модели ориентированы на увеличение затрат ресурсов пользователями сгенерированного кода (грязь -заслуги чистоплюев).
Hrethgir 12.06.2025
Вообще обратил внимание, что они генерируют код (впрочем так-же ориентированы разработчики чипов даже), чтобы пользователь их использующий уходил в тот или иной убыток. Это достаточно опытные модели,. . .
Топ10 библиотек C для квантовых вычислений
bytestream 12.06.2025
Квантовые вычисления - это та область, где теория встречается с практикой на границе наших знаний о физике. Пока большая часть шума вокруг квантовых компьютеров крутится вокруг языков высокого уровня. . .
Dispose и Finalize в C#
stackOverflow 12.06.2025
Работая с C# больше десяти лет, я снова и снова наблюдаю одну и ту же историю: разработчики наивно полагаются на сборщик мусора, как на волшебную палочку, которая решит все проблемы с памятью. Да,. . .
Повышаем производительность игры на Unity 6 с GPU Resident Drawer
GameUnited 11.06.2025
Недавно копался в новых фичах Unity 6 и наткнулся на GPU Resident Drawer - штуку, которая заставила меня присвистнуть от удивления. По сути, это внутренний механизм рендеринга, который автоматически. . .
Множества в Python
py-thonny 11.06.2025
В Python существует множество структур данных, но иногда я сталкиваюсь с задачами, где ни списки, ни словари не дают оптимального решения. Часто это происходит, когда мне нужно быстро проверять. . .
Работа с ccache/sccache в рамках C++
Loafer 11.06.2025
Утилиты ccache и sccache занимаются тем, что кешируют промежуточные результаты компиляции, таким образом ускоряя последующие компиляции проекта. Это означает, что если проект будет компилироваться. . .
Настройка MTProxy
Loafer 11.06.2025
Дополнительная информация к инструкции по настройке MTProxy: Перед сборкой проекта необходимо добавить флаг -fcommon в конец переменной CFLAGS в Makefile. Через crontab -e добавить задачу: 0 3. . .
Изучаем Docker: что это, как использовать и как это работает
Mr. Docker 10.06.2025
Суть Docker проста - это платформа для разработки, доставки и запуска приложений в контейнерах. Контейнер, если говорить образно, это запечатанная коробка, в которой находится ваше приложение вместе. . .
Тип Record в C#
stackOverflow 10.06.2025
Многие годы я разрабатывал приложения на C#, используя классы для всего подряд - и мне это казалось естественным. Но со временем, особенно в крупных проектах, я стал замечать, что простые классы. . .
Разработка плагина для Minecraft
Javaican 09.06.2025
За годы существования Minecraft сформировалась сложная экосистема серверов. Оригинальный (ванильный) сервер не поддерживает плагины, поэтому сообщество разработало множество альтернатив. CraftBukkit. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru