Первый мне как-то плохо пахнет — нет фабричного интерфейса. И в статический надо будет вносить изменения при создании нового класса (OCP violation, ИМХО)
1. это не объектно-ориентированный подход (я про свич) желательно что бы объекты сами регистрировались в фабрике.
2. нормальный способ, но только не показан вариант с ключем-объект (т.е. создание по ключю).
Здравствуйте, Stormblast, Вы писали:
S>Здравствуйте, zfima, Вы писали: Z>>Что скажете?
S>1. это не объектно-ориентированный подход (я про свич) желательно что бы объекты сами регистрировались в фабрике. S>2. нормальный способ, но только не показан вариант с ключем-объект (т.е. создание по ключю).
Можете показать вариант с ключем? Ну или что имеется ввиду?
Здравствуйте, zfima, Вы писали:
Z>это нормальная практика — статический класс-фабрика?
Моя позиция такая:
Можешь создавать объекты через конструкторы (не нарушая здравый смысл, логику и пр и пр) — создавай через конструкторы, только не надо что-то делать хитрое в самом конструкторе, поддерживай ленивость.
Не можешь, хочешь там null возвращать, или потомков, или прочие причины — добавляй статический фабричный метод в сам класс.
Если логика создания разрастается, идет сильная зависимость от чего-нибудь, или процесс хитрый, долгий, требует хранение данных и прочее — создавай полноценную фабрику.
Немного отступлю и покажу как 20 минут назад проредезайнил одну из своих аппликашек.
Значит так — у меня программка управляет разной хернёй на сервере во внутренней сетке или внешней — TX/RX
И потом она создаёт классы
RXFilesManager/TXFilesManager
RX_XMLManager/TX_XMLManager
ServiceConfigurationRX/ServiceConfigurationTX
и оперирует ими
Создавала их, конечно, посредством Switch!!!
if (_safePathSide == SafePathSide.RX)
{
_serviceConfiguration = new ServiceConfigurationRX();
}
else if (_safePathSide == SafePathSide.TX)
{
_serviceConfiguration = new ServiceConfigurationTX();
}
else
{
throw new NotImplementedException();
}
switch (_safePathSide)
{
case SafePathSide.RX:
filesManager = new RXFilesManager(_sourceServiceDirectory);
xmlManager = new RX_XMLManager();
break;
case SafePathSide.TX:
filesManager = new TXFilesManager(_sourceServiceDirectory);
xmlManager = new TX_XMLManager();
break;
default:
throw new NotImplementedException();
}
switch (_safePathSide)
{
case SafePathSide.RX:
filesManager = new RXFilesManager(dir);
filesManager.SetDestination(dir);
xmlManager = new RX_XMLManager();
break;
case SafePathSide.TX:
filesManager = new TXFilesManager(dir);
filesManager.SetDestination(dir);
xmlManager = new TX_XMLManager();
break;
default:
throw new NotImplementedException();
}
ну, не смог я выделить до сегодняшнего дня абстракцию TX и RX!!!
Сегодня понял и создал фабрику:
public interface ISideFactory
{
FilesManager CreateFileManager(DirectoryInfo sourceDirectory);
XMLManager CreateXMLManager();
IServiceConfigurator CreateServiceConfigurator();
}
public class RXFactory : ISideFactory
{
public FilesManager CreateFileManager(DirectoryInfo sourceDirectory)
{
return new RXFilesManager(sourceDirectory);
}
public XMLManager CreateXMLManager()
{
return new RX_XMLManager();
}
public IServiceConfigurator CreateServiceConfigurator()
{
return new ServiceConfigurationRX();
}
}
public class TXFactory : ISideFactory
{
public FilesManager CreateFileManager(DirectoryInfo sourceDirectory)
{
return new TXFilesManager(sourceDirectory);
}
public XMLManager CreateXMLManager()
{
return new TX_XMLManager();
}
public IServiceConfigurator CreateServiceConfigurator()
{
return new ServiceConfigurationTX();
}
}
Здравствуйте, zfima, Вы писали:
Z>Можете показать вариант с ключем? Ну или что имеется ввиду?
Если говорить про С++ то это регистрация в фабрике в статической мапе, где ключ константа(код объекта), а значение указатель на метод создания конкретной реализации.
Если про джаву то это например, енум который сам по себе является ключом а переопределенные методы в нем создают конкретную реализацию.
Здравствуйте, Stormblast, Вы писали:
S>Здравствуйте, zfima, Вы писали:
Z>>Можете показать вариант с ключем? Ну или что имеется ввиду?
S>Если говорить про С++ то это регистрация в фабрике в статической мапе, где ключ константа(код объекта), а значение указатель на метод создания конкретной реализации.
Т.е. тот, кто хочет создаваться через фабрику должен сам же в этой фабрике зарегистрироваться?