![]() |
Фабрика не должна отдавать объекты?
Здравствуйте!
Изучаю замечательную книгу Шаблоны проектирования (Design Patterns) O'REILLY. Первый шаблон в этой книге - Фабричный метод (Factory Method). Этот шаблон помогает создавать множество типов объектов через обращение в одну общую точку, так называемую фабрику. Во всех примерах в этой книге фабрика не отдает объект. Она создает объект и сама же выполняет манипуляции с ним. Но если я хочу управлять объектом вне фабрики? Правильно ли будет изменить фабрику так, чтобы она возвращала этот объект или это противоречит шаблону? Приведу примерный код минималистического примера из книги: Код AS3:
Код AS3:
Код AS3:
Код AS3:
Если да, то как управлять объектами после создания в фабрике? Поделитесь пожалуйста опытом :) |
Что то как то странно, поидее фабрика должна выглядеть так
Код AS3:
Тоесть логично рассуждая : Клиент звонит на фабрику и спрашивает , а не могли ли бы вы мне завернуть 5 коробок дюлей? Ему говорят конечно - вот вам 5 коробок, но знайте что если пнуть коробку, она сама откроется Код AS3:
С другой стороны тип фабрики может быть другой. Например - ремонтная мастерская, это тоже фабрика , но по ремонту, и тогда мы уже говорим фабрике - почините мне 5 телевизиров 1ой марки ))) |
Не надо путать "абстрактную фабрику" и "фабричный метод".
А паттерн "просто фабрика" не является GoF-овским, если вообще является паттерном (хотя штука полезная и используется) Фабричный метод вприципе может подразумевать использование объекта самим собой. Это для изменения поведения объекта через наследование нужно и, на сам деле он то как раз на практике и используется и _очень_ часто, а "абстрактная фабрика" - не помню ни одного случая в своей практике. Ну может пару раз было. |
@in4core : спасибо за пример)
@expl : А зачем нужна "абстрактная фабрика"? Просто для подготовки объектов в одном месте? И "простая фабрика" == "абстрактная фабрика" ? |
Ну абстрактная это так скажем пример. Это как говорить *в общем*. Так же как MVC - есть же такой паттерн, но никто ни слова не упоминает о том, что внутри могут быть реализации других паттернов и т.п.
Бред несу....))) |
Цитата:
Она представляет собой множество фабрик с одинаковым интерфейсом. И одна фабрика производит несколько типов объектов Классический пример приводят - это разные скины всех контролов. Т.е. одна фабрика генерит контролы аля виндовс, другая - аля мак. А тот кто эти контролы располагает и связывает в игре просто при запуске подставляет одну из фабрик и везде if-ы не пишет. Но штука громоздкая, потому не используется, или используется изредка во фреймворках. Цитата:
Простая фабрика это просто что угодно с публичным методом/методами newSomeObject():SomeObject. Есть статическая простая фабрика - её методы статические. Абстрактная фабрика подразумевает, что фабрик несколько и они имеют общий интерфейс - абстрактную фабрику Ну вот не хочется вам кнопку по 10 раз настраивать в 10 местах - вы делаете метод "newCustomizedButton", в котором её создаёте и настраиваете. А во всех частях вместо 5 строк кода пишете одну - MyFactory.newCustomizedButton(); Это простая статическая фабрика Или вот Вы создаете список с рендерерами во flex. Чтобы он отображал рендереры класса MyRenderer вы туда передаёте фабрику с интерфейсом: Код AS3:
А вот если бы было так: Код AS3:
|
Цитата:
То есть для каждого рендера свой интерфейс? Я думал создается просто несколько рендеров с одним интерфейсом и несколько фабрик, которые работают через единый интерфейс рендера. Одна фабрика - один тип рендера? Нет? |
Вы наверно не разобрались потому что я искусственный пример привёл.
Но объясню этот дурацкий пример до конца: Цитата:
Т.е. есть одна фабрика (ARedGreed implements IFactory), которая создает красные (RedSelectedRenderer implements ISelectedRenderer) и зелёные (GreenRenderer implements IGreenRenderer) а есть другая фабрика (ABlueYellow implements IFactory), которая создает синие (BlueSelectedRenderer implements ISelectedRenderer) и желтые (YellowRenderer implements IGreenRenderer) А визуальный список принимает, например, в конструктор IFactory, запоминает её, и когда надо что-то выделить - создаёт новый рендерер с newSelectedRenderer, а когда не надо - просто newRenderer Ну и понятно, что не всегда надо делать отдельные классы YellowRenderer и GreenRenderer - можно просто написть newRenderer():IRenderer { return new CommonRenderer(0xffff00); }. P.S. Вот хороший пример зачем используются фабрики вообще: http://gonchar.me/blog/goncharposts/411 |
Я использовал абстрактные фабрики довольно часто.
Вот пример. У меня есть абстрактный плагин в котором определено создание визуального объекта и прочее. там есть строчка в методе создания вьюшек по модели: Код AS3:
Можно этого же добиться переопределением абстрактного метода createView в наследниках, но тогда начинаются проблемы с наследованием и копипастой, а фабрика позволяет использовать композицию. |
| Часовой пояс GMT +4, время: 17:55. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.