Изучаю паттерны: Abstract Factory (комментарии)
Это сообщение сгенерировано автоматически.
IUnit *unit = UnitFactory->Create();
printf("%s\n", unit->GetDesc().c_str());
delete unit;Думаю, что хорошо, если завести привычку delete размещать в том же .cpp модуле, что и new. Потому что, если фабрика будет в другой DLL, то этот код закрэшится. Например, можно сделать метод Release() для юнита, где будет delete this; Или удалять той же фабрикой. Да и код проверять на лики будет проще.
wat
> Думаю, что хорошо, если завести привычку delete размещать в том же .cpp модуле,
> что и new.
Набросал пример по другому примеру:) А так да Пример писал выкинув все лишнее, так как лично меня очень сильно отвлекает куча стороннего кода, когда приходится читать сотни строк кода только для того чтобы понять метод из пяти строк - это просто ужОс
лучше покажи где хранить созданных юнитов.
codesnip
> лучше покажи где хранить созданных юнитов.
а где их хранить?
>лучше покажи где хранить созданных юнитов.
>а где их хранить?
не благодарите
Unit* Units[MAX_UNITS_COUNT];
Хорошая статья про фабрики: http://habrahabr.ru/post/129202/
И в GPG есть интересные вещи.
После джавы возникает стойкое отвращение к фабрикам, но вообще паттерн очень хороший и полезный.
geckowiki
> Хорошая статья про фабрики: http://habrahabr.ru/post/129202/
читану:)
Sergio
> После джавы возникает стойкое отвращение к фабрикам, но вообще паттерн очень
> хороший и полезный.
Вот что странно, разбираю паттерны - все красиво выглядит... Но никаких идей где это применять, а точнее на любую идею есть более простое решение. так что сейчас только для плюсика изучаю чтобы в чужих кодах легче было
war_zes
> Но никаких идей где это применять, а точнее на любую идею есть более простое
> решение.
Субж у меня всегда сам собой получался когда я писал сериализацию тем же "юнитам" (ну у меня не юниты были, но смысл тот же).
А почему бы не сделать через мета-классы?
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;
Хаус
> А почему бы не сделать через мета-классы?
Это называется виртуальные конструкторы - когда есть метаклассы как таковые и у них есть виртуальные методы, конструирующие в конкретных реализациях конкретные экземпляры (виртуальные конструкторы).
Метаклассы при этом начинают играть роль собственно классов фабрик из шаблона проектирования.
В Delphi такое есть и это действительно удобненько.
=A=L=X=
> В Delphi такое есть и это действительно удобненько.
В C++ нету такого? O_o
Sergio
> После джавы возникает стойкое отвращение к фабрикам
Почему?
Хаус
> В C++ нету такого? O_o
В С++ нет метаклассов как средства языка.
Фактически их приходится делать вручную. Ну или с помощью волшебных макросов как в каком нибудь MFC.
Я когда пишу сериализацию у меня всегда получается аналог, выглядит примерно так:
*.h
class MyClass: public Serializable { DECLARE_SERIALIZABLE ... };
*.cpp
IMPLEMENT_SERIALIZABLE(MyClass ) ...
Эти макросы как раз заводят вспомогательные классы, которые, суть регистрируются как фабрики в общем мапе фабрик, предоставляют интерфейс создания класса нулевого состояния и загрузки класса из потока, добавляют в сам класс метод получающий для объекта его метакласс и т.п. и т.д. Т.е. ручками.
Тема в архиве.