Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Метод фабрика, вопрос 
V
    Опции темы
kornata
Дата 5.4.2010, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 25.2.2010

Репутация: нет
Всего: нет



Здравствуйте! Скажите, в каких случаях статический метод фабрика полезнее конструктора и есть ли минусы в использовании фабрики вместо конструктора?
PM MAIL   Вверх
MaxPayneC
Дата 5.4.2010, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 18.2.2006

Репутация: 5
Всего: 9



Этот вопрос не имеет однозначного ответа.
Лично я придерживаюсь мнения, что фабрика нужна, когда много раз нужно получать объекты, создание которых нетривиально (отлично от присвоения полям значений, переданных в аргументах конструктора).
PM   Вверх
kornata
Дата 5.4.2010, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 25.2.2010

Репутация: нет
Всего: нет



Хм, спасибо за ответ! Да я тоже считаю что фабрика нужна ... и что, в ней нет никаких недостатков?
PM MAIL   Вверх
batigoal
Дата 5.4.2010, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(MaxPayneC @  5.4.2010,  21:30 Найти цитируемый пост)
Лично я придерживаюсь мнения, что фабрика нужна, когда много раз нужно получать объекты, создание которых нетривиально (отлично от присвоения полям значений, переданных в аргументах конструктора). 

Гм... Не ближе ли это к паттерну Builder, чем к фабрике?


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
jk1
Дата 5.4.2010, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Я бы больше акцентировал значение фабрики в контексте понижения coupling'a. Она может декларировать создание реализаций интерфейсов без раскрытия конкретных классов, которые могут быть анонимными или закрытыми в пакете. Выступая как часть шаблона проектирования Facade, она позволяет во многих случаях создавать эффективные "черные ящики", пряча детали внутренней реализации.

О недостатках: вы увеличиваете количество классов и (спорно) затрудняете понимание кода для не слишком опытных коллег. 


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
kornata
Дата 6.4.2010, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 25.2.2010

Репутация: нет
Всего: нет



Спасибо!
PM MAIL   Вверх
Christoph
Дата 7.5.2010, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: нет
Всего: 11



Решил не создавать новую тему, решил тут спросить...
Я не понимаю какая роль этого патерна, скрыть то как создается объект? Вот пример кода с книги 
Код

public interface Const {
public static final int SHAPE_CIRCLE =1;
public static final int SHAPE_SQUARE =2;
public static final int SHAPE_HEXAGON =3;
}


Код

public class ShapeFactory {
     public abstract Shape getShape(int shapeId);
}
public class SimpleShapeFactory extends
     ShapeFactory throws BadShapeException {
public Shape getShape(int shapeTypeId){
   Shape shape = null;
   if(shapeTypeId == Const.SHAPE_CIRCLE) {
      //in future can reuse or cache objects. 
    shape = new Circle();
}
else if(shapeTypeId == Const.SHAPE_SQUARE) {
//in future can reuse or cache objects
shape = new Square();
}
else throw new BadShapeException
(“ShapeTypeId=”+ shapeTypeId);
return shape;
}
}


затем вызов
Код

ShapeFactory factory = new SimpleShapeFactory();
//returns a Shape but whether it is a Circle or a
//Square is not known to the caller.
Shape s = factory.getShape(1);
s.draw(); // circle is drawn
//returns a Shape but whether it is a Circle or a
//Square is not known to the caller.
s = factory.getShape(2);
s.draw(); //Square is drawn


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


--------------------
user posted image
PM MAIL ICQ   Вверх
batigoal
Дата 9.5.2010, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



В моем понимании, фабрика имеет смысл, когда нужно создавать набор объектов, обладающих каким-то общим признаком. Например, представим себе приложение, имеющее GUI для монитора и для мобильника. Тогда:

Код

interface GuiComponentsFactory {
  Screen buildMainScreen();
  Menu buildMenus();
}

class MobileGuiComponentsFactory implements GuiComponentsFactory { }
class DesktopGuiComponentsFactory implements GuiComponentsFactory { }

class MainApplication {
  main() {
    GuiComponentsFactory factory = new MobileGuiComponentsFactory()
    
    Screen mainScreen = factory.buildMainScreen();
    Menu menu = factory.buildMenus();
  }
}


Пример не слишком удачный, но идея такая.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Christoph
Дата 9.5.2010, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 667
Регистрация: 23.1.2008
Где: Харьков

Репутация: нет
Всего: 11



как по мне это даже нельзя назвать патерном smile просто 2 класса реализует один интерфейс


--------------------
user posted image
PM MAIL ICQ   Вверх
batigoal
Дата 10.5.2010, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Цитата(Christoph @  9.5.2010,  18:48 Найти цитируемый пост)
как по мне это даже нельзя назвать патерном smile просто 2 класса реализует один интерфейс 

Половина паттернов и того не имеет smile


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0513 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.