Что такое абстрактная фабрика?
От: Sorc17 Россия  
Дата: 21.02.12 06:33
Оценка:
Крутая получилась тема "Что такое полиморфизм?" Так сказать по-хадркору объяснили все глубины глубин полиморфизма. Может быть так же объясните для особо одарённых, что такое абстрактная фабрика и зачем она нужна? >< Ниасиливаю
Для нас [Thompson, Rob Pike, Robert Griesemer] это было просто исследование. Мы собрались вместе и решили, что ненавидим C++ [смех].
Re: Что такое абстрактная фабрика?
От: andyag  
Дата: 21.02.12 07:21
Оценка:
Здравствуйте, Sorc17, Вы писали:

S>Крутая получилась тема "Что такое полиморфизм?" Так сказать по-хадркору объяснили все глубины глубин полиморфизма. Может быть так же объясните для особо одарённых, что такое абстрактная фабрика и зачем она нужна? >< Ниасиливаю


Фабрика делает черные ботинки. Другая фабрика делает желтые ботинки.
Абстрактная фабрика — это какая-то одна из тех двух: когда ты просишь её изготовить тебе ботинок, ты не можешь быть уверен, сделают они чёрный или желтый.
Re[2]: Что такое абстрактная фабрика?
От: alexlz  
Дата: 21.02.12 08:04
Оценка: 3 (1) +1 :)))
Здравствуйте, andyag, Вы писали:

A>Фабрика делает черные ботинки. Другая фабрика делает желтые ботинки.

A>Абстрактная фабрика — это какая-то одна из тех двух: когда ты просишь её изготовить тебе ботинок, ты не можешь быть уверен, сделают они чёрный или желтый.
А может круче? Абстрактная фабрика находится в абстрактном месте, на ней абстрактно трудятся абстрактные рабочие, абстрактно выпускающие абстрактную продукцию для абстрактных потребителей. Но зато курсы по ООП, ООД и проч., где изучают эти абстрактные вещи зарабатывают вполне конкретные деньги.
Re[3]: Что такое абстрактная фабрика?
От: andyag  
Дата: 21.02.12 08:17
Оценка:
Здравствуйте, 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(); // где-то здесь используется фабрика - цвет ботинков не известен
Re: Что такое абстрактная фабрика?
От: abibok  
Дата: 21.02.12 22:12
Оценка:
Абстрактная фабрика — это интерфейс, описывающий то, какой должна быть конкретная фабрика. Например, есть игра. В игре есть фабрика делающая солдат. Есть еще фабрика, делающая танки. И еще фабрика, делающая деревья. Вместо того, чтобы помнить о деталях реализации каждой из них, мы работаем с ними как с абстрактной фабрикой "сделай мне один экземпляр того, что ты умеешь делать". Такой вызов может направляться непосредственно в фабрику или в промежуточный объект — фабрику фабрик, т.е. "фабрика фабрик, дай мне фабрику, которая умеет делать танки". Фабрика фабрик, в свою очередь, тоже может быть абстрактной. Тогда можно запрашивать фабрики, о существовании которых не известно заранее, например загружаемые из dll во время работы.
Re[2]: Что такое абстрактная фабрика?
От: andyag  
Дата: 21.02.12 22:34
Оценка: :)
Здравствуйте, abibok, Вы писали:

A>Абстрактная фабрика — это интерфейс, описывающий то, какой должна быть конкретная фабрика. Например, есть игра. В игре есть фабрика делающая солдат. Есть еще фабрика, делающая танки. И еще фабрика, делающая деревья. Вместо того, чтобы помнить о деталях реализации каждой из них, мы работаем с ними как с абстрактной фабрикой "сделай мне один экземпляр того, что ты умеешь делать". Такой вызов может направляться непосредственно в фабрику или в промежуточный объект — фабрику фабрик, т.е. "фабрика фабрик, дай мне фабрику, которая умеет делать танки". Фабрика фабрик, в свою очередь, тоже может быть абстрактной. Тогда можно запрашивать фабрики, о существовании которых не известно заранее, например загружаемые из dll во время работы.


Вы так правда думаете или это провокация?
Re[2]: Что такое абстрактная фабрика?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 21.02.12 23:18
Оценка:
Здравствуйте, abibok, Вы писали:

A>Абстрактная фабрика — это интерфейс, описывающий то, какой должна быть конкретная фабрика. Например, есть игра. В игре есть фабрика делающая солдат. Есть еще фабрика, делающая танки. И еще фабрика, делающая деревья.


Это бессмысленно (ну, почти бесмысленно), в рамках одной фабрики создавать разнотипные сущности. Суть абстрактной фабрики в том, что она создает разные реализации под единый контракт. Если переходить на твой пример, то абстрактная фабрика солдат может создавать солдат разных армий в зависимости от начальной настройки. При этом далее эти солдаты обрабатываются по единым правилам.
... << RSDN@Home 1.2.0 alpha 5 rev. 21 on Windows 7 6.1.7601.65536>>
AVK Blog
Re[4]: Что такое абстрактная фабрика?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 21.02.12 23:46
Оценка:
A>Boot boot = bootFactory.createBoot(); // где-то здесь используется фабрика — цвет ботинков не известен

это скорее фабричный метод, чем абстрактная фабрика.
Re[3]: Что такое абстрактная фабрика?
От: abibok  
Дата: 22.02.12 00:07
Оценка:
A>>Абстрактная фабрика — это интерфейс, описывающий то, какой должна быть конкретная фабрика. Например, есть игра. В игре есть фабрика делающая солдат. Есть еще фабрика, делающая танки. И еще фабрика, делающая деревья.

AVK>Это бессмысленно (ну, почти бесмысленно), в рамках одной фабрики создавать разнотипные сущности.


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

AVK>Суть абстрактной фабрики в том, что она создает разные реализации под единый контракт.


Чем это отличается от того, что сказал я? Рассмотрим другой пример: абстрактная фабрика, которая создает visual controls — buttons, labels, shapes, text fields, frames. Такая абстрактная фабрика будет описывать контракт на реализацию конкретной фабрики "я могу создать control, который умеет draw, move, enable/disable". То есть разные сущности с общим поведением. Сама по себе абстрактная фабрика не имеет реализации и ничего создавать не может. От нее наследуются конкретные фабрики — ButtonFactory, LabelFactory, ShapeFactory, TextFieldFactory, FrameFactory, которые выпускают сущности, реализующие некоторый интерфейс IVisualControl. Таким образом наш код может создать группу контролов и потом обращаться с ними единообразно, ничего не зная о том как они устроены внутри и что требуется для их создания.

AVK>Если переходить на твой пример, то абстрактная фабрика солдат может создавать солдат разных армий в зависимости от начальной настройки. При этом далее эти солдаты обрабатываются по единым правилам.


Если солдаты разных армий требуют для своего создания разных фабрик, то да. Но в данном случае это больше похоже не на абстрактную, а на конкретную фабрику, которая создает сущность "солдат" с некоторыми параметрами, например "цвет формы" или "модель оружия". При этом такая фабрика может использовать другую фабрику (и даже абстрактную фабрику) для создания этого самого оружия с интерфейсом "носиться" и "стрелять".
Re: Что такое абстрактная фабрика?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 22.02.12 00:22
Оценка:
S> Может быть так же объясните для особо одарённых, что такое абстрактная фабрика и зачем она нужна?

вот пишем мы, например, убийцу total commander-а и хотим добавить поддержку архиваторов.

в первом приближении можно сделать:
interface IArchivator
{
  byte[] Pack(byte[] data);
  byte[] Unpack(byte[] data);
}
class ZipArchivator{...}
class RarArchivator{...}

всё отлично работает, но функционал получился убогий — ни на паузу поставить, ни отменить архивацию и т.д..

рефакторим и получаем:
interface IOperation<TSource, TResult>
{
  void Start(TSource source);
  void Cancel();
  void Pause();
  void Unpause();
  bool IsReady{get;}
  TResult Finish();
  event EventHandler OnReady;
}

interface IArchivator
{
  IOperation<TSource, TResult> CreatePackOperation();
  IOperation<TSource, TResult> CreateUnpackOperation();
}

и в данном случае, IArchivator — уже стал абстрактной фабрикой.
Re[3]: Что такое абстрактная фабрика?
От: Lloyd Россия  
Дата: 22.02.12 00:30
Оценка: +3
Здравствуйте, AndrewVK, Вы писали:

A>>Абстрактная фабрика — это интерфейс, описывающий то, какой должна быть конкретная фабрика. Например, есть игра. В игре есть фабрика делающая солдат. Есть еще фабрика, делающая танки. И еще фабрика, делающая деревья.


AVK>Это бессмысленно (ну, почти бесмысленно), в рамках одной фабрики создавать разнотипные сущности. Суть абстрактной фабрики в том, что она создает разные реализации под единый контракт.


По-моему, такое определение больше соответствует фабричному методу.
Отличие абстрактной фабрики в том, что она предназначена для создания семейства объектов, а не одного контракта.
Re[4]: Что такое абстрактная фабрика?
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 22.02.12 08:25
Оценка:
Здравствуйте, 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>>
AVK Blog
Re[5]: Что такое абстрактная фабрика?
От: . Великобритания  
Дата: 25.02.12 20:43
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG> A>Boot boot = bootFactory.createBoot(); // где-то здесь используется фабрика — цвет ботинков не известен


DG> это скорее фабричный метод, чем абстрактная фабрика.

Нет. Таки фабрика. Недавно этот вопрос поднимали
Автор: Poul_Ko
Дата: 27.01.12
.
avalon 1.0rc3 rev 0, zlib 1.2.3.4
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: Что такое абстрактная фабрика?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 25.02.12 21:08
Оценка:
Здравствуйте, ., Вы писали:

.>Здравствуйте, DarkGray, Вы писали:


DG>> A>Boot boot = bootFactory.createBoot(); // где-то здесь используется фабрика — цвет ботинков не известен


DG>> это скорее фабричный метод, чем абстрактная фабрика.

.>Нет. Таки фабрика. Недавно этот вопрос поднимали
Автор: Poul_Ko
Дата: 27.01.12
.


в вики — это обзывают фабричным методом, даже код для ФМ такой же как у andyag

// "ConcreteProductA"
 
class ConcreteProductA : Product
{
}
 
// "ConcreteProductB"
 
class ConcreteProductB : Product
{
}
 
// "Creator"
 
abstract class Creator
{
  public abstract Product FactoryMethod();
}
 
// "ConcreteCreatorA"
 
class ConcreteCreatorA : Creator
{
  public override Product FactoryMethod()
  {
    return new ConcreteProductA();
  }
}
 
// "ConcreteCreatorB"
 
class ConcreteCreatorB : Creator
{
  public override Product FactoryMethod()
  {
    return new ConcreteProductB();
  }
}
Re[7]: Что такое абстрактная фабрика?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 25.02.12 21:09
Оценка:
http://ru.wikipedia.org/wiki/%D4%E0%E1%F0%E8%F7%ED%FB%E9_%EC%E5%F2%EE%E4_(%F8%E0%E1%EB%EE%ED_%EF%F0%EE%E5%EA%F2%E8%F0%EE%E2%E0%ED%E8%FF)

зы
у абстрактной фабрики ключевым свойством заявляют возможность создания несколько различных согласованных между собой видов объектов
Re[7]: Что такое абстрактная фабрика?
От: . Великобритания  
Дата: 25.02.12 22:57
Оценка:
Здравствуйте, DarkGray, Вы писали:

DG> в вики — это обзывают фабричным методом, даже код для ФМ такой же как у andyag

Что можно сказать — дело плохо с этими паттернами. Ибо в англоязычной вики подобный код называется фабрикой.
avalon 1.0rc3 rev 0, zlib 1.2.3.4
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[8]: Что такое абстрактная фабрика?
От: abibok  
Дата: 26.02.12 05:36
Оценка:
DG>у абстрактной фабрики ключевым свойством заявляют возможность создания несколько различных согласованных между собой видов объектов

Википедия гонит. Связность объектов или их возможность взаимодействовать друг с другом не является определяющим признаком абстрактной фабрики. Читайте про шаблоны в оригинале.
Re: Что такое абстрактная фабрика?
От: nen777w  
Дата: 09.03.12 16:10
Оценка: :)
Здравствуйте, Sorc17, Вы писали:

S>Крутая получилась тема "Что такое полиморфизм?" Так сказать по-хадркору объяснили все глубины глубин полиморфизма. Может быть так же объясните для особо одарённых, что такое абстрактная фабрика и зачем она нужна? >< Ниасиливаю


Элементарно!
Re[2]: Что такое абстрактная фабрика?
От: -VaS- Россия vaskir.blogspot.com
Дата: 12.03.12 13:16
Оценка:
DG>
DG>interface IOperation<TSource, TResult>
DG>{
DG>  void Start(TSource source);
DG>  void Cancel();
DG>  void Pause();
DG>  void Unpause();
DG>  bool IsReady{get;}
DG>  TResult Finish();
DG>  event EventHandler OnReady;
DG>}

DG>interface IArchivator
DG>{
DG>  IOperation<TSource, TResult> CreatePackOperation();
DG>  IOperation<TSource, TResult> CreateUnpackOperation();
DG>}

DG>


Зачем тут дженерики?
Re[3]: Что такое абстрактная фабрика?
От: DarkGray Россия http://blog.metatech.ru/post/ogni-razrabotki.aspx
Дата: 12.03.12 13:34
Оценка:
VS>Зачем тут дженерики?

для того, чтобы IOperation можно было использовать для единого описания длительных операций
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.