Войти
WarZesФорум

Изучаю паттерны: Abstract Factory (комментарии)

Страницы: 1 2 Следующая »
#0
12:09, 6 мая 2013

Изучаю паттерны: Abstract Factory (комментарии)

Это сообщение сгенерировано автоматически.

#1
12:09, 6 мая 2013
  IUnit *unit = UnitFactory->Create();
  printf("%s\n", unit->GetDesc().c_str());
  delete unit;

Думаю, что хорошо, если завести привычку delete размещать в том же .cpp модуле, что и new. Потому что, если фабрика будет в другой DLL, то этот код закрэшится. Например, можно сделать метод Release() для юнита, где будет delete this; Или удалять той же фабрикой. Да и код проверять на лики будет проще.

#2
12:24, 6 мая 2013

wat
> Думаю, что хорошо, если завести привычку delete размещать в том же .cpp модуле,
> что и new.
Набросал пример по другому примеру:) А так да Пример писал выкинув все лишнее, так как лично меня очень сильно отвлекает куча стороннего кода, когда приходится читать сотни строк кода только для того чтобы понять метод из пяти строк - это просто ужОс

#3
21:52, 9 мая 2013

лучше покажи где хранить созданных юнитов.

#4
7:21, 10 мая 2013

codesnip
> лучше покажи где хранить созданных юнитов.
а где их хранить?

#5
9:14, 10 мая 2013

>лучше покажи где хранить созданных юнитов.

>а где их хранить?
не благодарите

Unit* Units[MAX_UNITS_COUNT];

#6
12:08, 10 мая 2013

Хорошая статья про фабрики: http://habrahabr.ru/post/129202/
И в GPG есть интересные вещи.

#7
14:23, 10 мая 2013

После джавы возникает стойкое отвращение к фабрикам, но вообще паттерн очень хороший и полезный.

#8
15:41, 10 мая 2013

geckowiki
> Хорошая статья про фабрики: http://habrahabr.ru/post/129202/
читану:)

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

#9
16:32, 10 мая 2013

war_zes
> Но никаких идей где это применять, а точнее на любую идею есть более простое
> решение.

Субж у меня всегда сам собой получался когда я писал сериализацию тем же "юнитам" (ну у меня не юниты были, но смысл тот же).

Прошло более 3 лет
#10
22:05, 19 окт. 2016

А почему бы не сделать через мета-классы?

type
  TUnit = class (TObject)
  end;

  TUnitMeta = class of TUnit;

  TShooter = class (TUnit)
  end;

  TPsycho = class (TUnit)
  end;

procedure TForm1.Button1Click(Sender: TObject);
var
  UnitMeta: TUnitMeta;
  UnitNew:  TUnit;
begin
  UnitMeta:= TPsycho;

  UnitNew:= UnitMeta.Create();

  Caption:= UnitNew.ClassName;

  FreeAndNil(UnitNew);
end;
#11
7:36, 20 окт. 2016

Хаус
> А почему бы не сделать через мета-классы?

Это называется виртуальные конструкторы - когда есть метаклассы как таковые и у них есть виртуальные методы, конструирующие в конкретных реализациях конкретные экземпляры (виртуальные конструкторы).
Метаклассы при этом начинают играть роль собственно классов фабрик из шаблона проектирования.
В Delphi такое есть и это действительно удобненько.

#12
13:21, 20 окт. 2016

=A=L=X=
> В Delphi такое есть и это действительно удобненько.

В C++ нету такого? O_o

#13
13:26, 20 окт. 2016

Sergio
> После джавы возникает стойкое отвращение к фабрикам

Почему?

#14
13:35, 20 окт. 2016

Хаус
> В C++ нету такого? O_o

В С++ нет метаклассов как средства языка.
Фактически их приходится делать вручную. Ну или с помощью волшебных макросов как в каком нибудь MFC.
Я когда пишу сериализацию у меня всегда получается аналог, выглядит примерно так:

*.h

class MyClass: public Serializable
{
  DECLARE_SERIALIZABLE
  ...
};

*.cpp

IMPLEMENT_SERIALIZABLE( MyClass )
...

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

Страницы: 1 2 Следующая »
WarZesФорум

Тема в архиве.