Войти
WarZesФорум

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

Страницы: 1 2 Следующая »
#0

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

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

6 мая 2013

#1
  IUnit *unit = UnitFactory->Create();
  printf("%s\n", unit->GetDesc().c_str());
  delete unit;

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

6 мая 2013

#2

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

6 мая 2013

#3

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

9 мая 2013

#4

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

10 мая 2013

#5

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

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

Unit* Units[MAX_UNITS_COUNT];

10 мая 2013

#6

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

10 мая 2013

#7

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

10 мая 2013

#8

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

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

10 мая 2013

#9

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

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

10 мая 2013

Прошло более 3 лет
#10

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

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;

19 окт. 2016

#11

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

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

20 окт. 2016

#12

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

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

20 окт. 2016

#13

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

Почему?

20 окт. 2016

#14

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

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

*.h

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

*.cpp

IMPLEMENT_SERIALIZABLE( MyClass )
...

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

20 окт. 2016

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

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