Крутая получилась тема "Что такое полиморфизм?" Так сказать по-хадркору объяснили все глубины глубин полиморфизма. Может быть так же объясните для особо одарённых, что такое абстрактная фабрика и зачем она нужна? >< Ниасиливаю
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Здравствуйте, Sorc17, Вы писали:
S>Крутая получилась тема "Что такое полиморфизм?" Так сказать по-хадркору объяснили все глубины глубин полиморфизма. Может быть так же объясните для особо одарённых, что такое абстрактная фабрика и зачем она нужна? >< Ниасиливаю
Фабрика делает черные ботинки. Другая фабрика делает желтые ботинки.
Абстрактная фабрика — это какая-то одна из тех двух: когда ты просишь её изготовить тебе ботинок, ты не можешь быть уверен, сделают они чёрный или желтый.
Здравствуйте, andyag, Вы писали:
A>Фабрика делает черные ботинки. Другая фабрика делает желтые ботинки. A>Абстрактная фабрика — это какая-то одна из тех двух: когда ты просишь её изготовить тебе ботинок, ты не можешь быть уверен, сделают они чёрный или желтый.
А может круче? Абстрактная фабрика находится в абстрактном месте, на ней абстрактно трудятся абстрактные рабочие, абстрактно выпускающие абстрактную продукцию для абстрактных потребителей. Но зато курсы по ООП, ООД и проч., где изучают эти абстрактные вещи зарабатывают вполне конкретные деньги.
Здравствуйте, alexlz, Вы писали:
A>Здравствуйте, andyag, Вы писали:
A>>Фабрика делает черные ботинки. Другая фабрика делает желтые ботинки. A>>Абстрактная фабрика — это какая-то одна из тех двух: когда ты просишь её изготовить тебе ботинок, ты не можешь быть уверен, сделают они чёрный или желтый. A>А может круче? Абстрактная фабрика находится в абстрактном месте, на ней абстрактно трудятся абстрактные рабочие, абстрактно выпускающие абстрактную продукцию для абстрактных потребителей. Но зато курсы по ООП, ООД и проч., где изучают эти абстрактные вещи зарабатывают вполне конкретные деньги.
Ничего не понял.
abstract class Boot {...}
class BlackBoot : Boot {...}
class YellowBoot : Boot {...}
abstract class BootFactory {...}
class BlackBootFactory : BootFactory {...}
class YellowBootFactory : BootFactory {...}
...
BootFactory bootFactory = ... // где-то здесь принимается решение о цвете ботинков
...
Boot boot = bootFactory.createBoot(); // где-то здесь используется фабрика - цвет ботинков не известен
Абстрактная фабрика — это интерфейс, описывающий то, какой должна быть конкретная фабрика. Например, есть игра. В игре есть фабрика делающая солдат. Есть еще фабрика, делающая танки. И еще фабрика, делающая деревья. Вместо того, чтобы помнить о деталях реализации каждой из них, мы работаем с ними как с абстрактной фабрикой "сделай мне один экземпляр того, что ты умеешь делать". Такой вызов может направляться непосредственно в фабрику или в промежуточный объект — фабрику фабрик, т.е. "фабрика фабрик, дай мне фабрику, которая умеет делать танки". Фабрика фабрик, в свою очередь, тоже может быть абстрактной. Тогда можно запрашивать фабрики, о существовании которых не известно заранее, например загружаемые из dll во время работы.
Здравствуйте, abibok, Вы писали:
A>Абстрактная фабрика — это интерфейс, описывающий то, какой должна быть конкретная фабрика. Например, есть игра. В игре есть фабрика делающая солдат. Есть еще фабрика, делающая танки. И еще фабрика, делающая деревья. Вместо того, чтобы помнить о деталях реализации каждой из них, мы работаем с ними как с абстрактной фабрикой "сделай мне один экземпляр того, что ты умеешь делать". Такой вызов может направляться непосредственно в фабрику или в промежуточный объект — фабрику фабрик, т.е. "фабрика фабрик, дай мне фабрику, которая умеет делать танки". Фабрика фабрик, в свою очередь, тоже может быть абстрактной. Тогда можно запрашивать фабрики, о существовании которых не известно заранее, например загружаемые из dll во время работы.
Здравствуйте, abibok, Вы писали:
A>Абстрактная фабрика — это интерфейс, описывающий то, какой должна быть конкретная фабрика. Например, есть игра. В игре есть фабрика делающая солдат. Есть еще фабрика, делающая танки. И еще фабрика, делающая деревья.
Это бессмысленно (ну, почти бесмысленно), в рамках одной фабрики создавать разнотипные сущности. Суть абстрактной фабрики в том, что она создает разные реализации под единый контракт. Если переходить на твой пример, то абстрактная фабрика солдат может создавать солдат разных армий в зависимости от начальной настройки. При этом далее эти солдаты обрабатываются по единым правилам.
... << RSDN@Home 1.2.0 alpha 5 rev. 21 on Windows 7 6.1.7601.65536>>
A>>Абстрактная фабрика — это интерфейс, описывающий то, какой должна быть конкретная фабрика. Например, есть игра. В игре есть фабрика делающая солдат. Есть еще фабрика, делающая танки. И еще фабрика, делающая деревья.
AVK>Это бессмысленно (ну, почти бесмысленно), в рамках одной фабрики создавать разнотипные сущности.
В моем примере каждая конкретая фабрика делает один тип сущностей. Другое дело, что это может быть не конкретный тип, а абстрактная сущность с определенным интерфейсом поведения. Тогда фабрика будет выпускать абстрактные юниты, каждый из которых может быть солдатом, танком или деревом.
AVK>Суть абстрактной фабрики в том, что она создает разные реализации под единый контракт.
Чем это отличается от того, что сказал я? Рассмотрим другой пример: абстрактная фабрика, которая создает visual controls — buttons, labels, shapes, text fields, frames. Такая абстрактная фабрика будет описывать контракт на реализацию конкретной фабрики "я могу создать control, который умеет draw, move, enable/disable". То есть разные сущности с общим поведением. Сама по себе абстрактная фабрика не имеет реализации и ничего создавать не может. От нее наследуются конкретные фабрики — ButtonFactory, LabelFactory, ShapeFactory, TextFieldFactory, FrameFactory, которые выпускают сущности, реализующие некоторый интерфейс IVisualControl. Таким образом наш код может создать группу контролов и потом обращаться с ними единообразно, ничего не зная о том как они устроены внутри и что требуется для их создания.
AVK>Если переходить на твой пример, то абстрактная фабрика солдат может создавать солдат разных армий в зависимости от начальной настройки. При этом далее эти солдаты обрабатываются по единым правилам.
Если солдаты разных армий требуют для своего создания разных фабрик, то да. Но в данном случае это больше похоже не на абстрактную, а на конкретную фабрику, которая создает сущность "солдат" с некоторыми параметрами, например "цвет формы" или "модель оружия". При этом такая фабрика может использовать другую фабрику (и даже абстрактную фабрику) для создания этого самого оружия с интерфейсом "носиться" и "стрелять".
Здравствуйте, AndrewVK, Вы писали:
A>>Абстрактная фабрика — это интерфейс, описывающий то, какой должна быть конкретная фабрика. Например, есть игра. В игре есть фабрика делающая солдат. Есть еще фабрика, делающая танки. И еще фабрика, делающая деревья.
AVK>Это бессмысленно (ну, почти бесмысленно), в рамках одной фабрики создавать разнотипные сущности. Суть абстрактной фабрики в том, что она создает разные реализации под единый контракт.
По-моему, такое определение больше соответствует фабричному методу.
Отличие абстрактной фабрики в том, что она предназначена для создания семейства объектов, а не одного контракта.
Здравствуйте, abibok, Вы писали:
A> Рассмотрим другой пример: абстрактная фабрика, которая создает visual controls — buttons, labels, shapes, text fields, frames. Такая абстрактная фабрика будет описывать контракт на реализацию конкретной фабрики "я могу создать control, который умеет draw, move, enable/disable". То есть разные сущности с общим поведением. Сама по себе абстрактная фабрика не имеет реализации и ничего создавать не может. От нее наследуются конкретные фабрики — ButtonFactory, LabelFactory, ShapeFactory, TextFieldFactory, FrameFactory, которые выпускают сущности, реализующие некоторый интерфейс IVisualControl. Таким образом наш код может создать группу контролов и потом обращаться с ними единообразно, ничего не зная о том как они устроены внутри и что требуется для их создания.
Все то же самое — использование контролов невозможно нормальным образом без явного использования конкретных интерфейсов. Т.е., с практической точки зрения, обычно нет потребности создавать контролы и потом использовать исключительно их базовый контракт. За исключением разве что универсального десериализатора форм.
A>Если солдаты разных армий требуют для своего создания разных фабрик, то да.
Что значит требуют?
A> Но в данном случае это больше похоже не на абстрактную, а на конкретную фабрику, которая создает сущность "солдат" с некоторыми параметрами, например "цвет формы" или "модель оружия".
Ну вот одно из применений абстрактной фабрики как раз неявное указание параметров создания один раз, при инициализации фабрики.
A> При этом такая фабрика может использовать другую фабрику (и даже абстрактную фабрику) для создания этого самого оружия с интерфейсом "носиться" и "стрелять".
Это абсолютно неважно с точки зрения ответа на сабж.
... << RSDN@Home 1.2.0 alpha 5 rev. 21 on Windows 7 6.1.7601.65536>>
Здравствуйте, DarkGray, Вы писали:
DG> A>Boot boot = bootFactory.createBoot(); // где-то здесь используется фабрика — цвет ботинков не известен
DG> это скорее фабричный метод, чем абстрактная фабрика.
Нет. Таки фабрика. Недавно этот вопрос поднимали
Здравствуйте, ., Вы писали:
.>Здравствуйте, DarkGray, Вы писали:
DG>> A>Boot boot = bootFactory.createBoot(); // где-то здесь используется фабрика — цвет ботинков не известен
DG>> это скорее фабричный метод, чем абстрактная фабрика. .>Нет. Таки фабрика. Недавно этот вопрос поднимали
Здравствуйте, DarkGray, Вы писали:
DG> в вики — это обзывают фабричным методом, даже код для ФМ такой же как у andyag
Что можно сказать — дело плохо с этими паттернами. Ибо в англоязычной вики подобный код называется фабрикой.
DG>у абстрактной фабрики ключевым свойством заявляют возможность создания несколько различных согласованных между собой видов объектов
Википедия гонит. Связность объектов или их возможность взаимодействовать друг с другом не является определяющим признаком абстрактной фабрики. Читайте про шаблоны в оригинале.
Здравствуйте, Sorc17, Вы писали:
S>Крутая получилась тема "Что такое полиморфизм?" Так сказать по-хадркору объяснили все глубины глубин полиморфизма. Может быть так же объясните для особо одарённых, что такое абстрактная фабрика и зачем она нужна? >< Ниасиливаю