Фабричный метод
От: zfima  
Дата: 17.07.12 07:24
Оценка:
Нашел 2 примера:
http://www.dotnetperls.com/factory
и
http://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D0%B1%D1%80%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)

Первый мне как-то плохо пахнет — нет фабричного интерфейса. И в статический надо будет вносить изменения при создании нового класса (OCP violation, ИМХО)

Что скажете?
Re: Фабричный метод
От: Stormblast http://www.myspace.com/stormblastblack
Дата: 17.07.12 07:34
Оценка:
Здравствуйте, zfima, Вы писали:
Z>Что скажете?

1. это не объектно-ориентированный подход (я про свич) желательно что бы объекты сами регистрировались в фабрике.
2. нормальный способ, но только не показан вариант с ключем-объект (т.е. создание по ключю).
Re[2]: Фабричный метод
От: zfima  
Дата: 17.07.12 07:41
Оценка:
Здравствуйте, Stormblast, Вы писали:

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

Z>>Что скажете?

S>1. это не объектно-ориентированный подход (я про свич) желательно что бы объекты сами регистрировались в фабрике.

S>2. нормальный способ, но только не показан вариант с ключем-объект (т.е. создание по ключю).

Можете показать вариант с ключем? Ну или что имеется ввиду?
Re: Фабричный метод
От: zfima  
Дата: 17.07.12 07:46
Оценка:
Здравствуйте, zfima, Вы писали:

Z>Нашел 2 примера:

Z>http://www.dotnetperls.com/factory
Z>и
Z>http://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D0%B1%D1%80%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)

Z>Первый мне как-то плохо пахнет — нет фабричного интерфейса. И в статический надо будет вносить изменения при создании нового класса (OCP violation, ИМХО)


Z>Что скажете?


Нашел ещё-
http://dotnet.dzone.com/articles/design-patterns-c-factory
http://stackoverflow.com/questions/515269/factory-pattern-in-c-how-to-ensure-an-object-instance-can-only-be-created-by-a

это нормальная практика — статический класс-фабрика?
Re[2]: Фабричный метод
От: Nuseraro Россия  
Дата: 17.07.12 08:52
Оценка: 1 (1)
Здравствуйте, zfima, Вы писали:

Z>это нормальная практика — статический класс-фабрика?


Моя позиция такая:

Можешь создавать объекты через конструкторы (не нарушая здравый смысл, логику и пр и пр) — создавай через конструкторы, только не надо что-то делать хитрое в самом конструкторе, поддерживай ленивость.

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

Если логика создания разрастается, идет сильная зависимость от чего-нибудь, или процесс хитрый, долгий, требует хранение данных и прочее — создавай полноценную фабрику.
Homo Guglens
Re: Фабричный метод
От: zfima  
Дата: 17.07.12 09:01
Оценка:
Здравствуйте, zfima, Вы писали:

Z>Нашел 2 примера:

Z>http://www.dotnetperls.com/factory
Z>и
Z>http://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D0%B1%D1%80%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_(%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)

Z>Первый мне как-то плохо пахнет — нет фабричного интерфейса. И в статический надо будет вносить изменения при создании нового класса (OCP violation, ИМХО)


Z>Что скажете?


Немного отступлю и покажу как 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();
        }
    }


жизнь стала легче
Re[2]: Фабричный метод
От: -VaS- Россия vaskir.blogspot.com
Дата: 17.07.12 10:46
Оценка:
Вы создали Abstract Factory, а не Factory Method.
Re[3]: Фабричный метод
От: zfima  
Дата: 17.07.12 11:12
Оценка:
Здравствуйте, -VaS-, Вы писали:

VS>Вы создали Abstract Factory, а не Factory Method.


Ну да, ошибка. Спасибо

Дальше буду отделять логику от UI с MVC
Re[3]: Фабричный метод
От: Stormblast http://www.myspace.com/stormblastblack
Дата: 18.07.12 08:06
Оценка:
Здравствуйте, zfima, Вы писали:

Z>Можете показать вариант с ключем? Ну или что имеется ввиду?


Если говорить про С++ то это регистрация в фабрике в статической мапе, где ключ константа(код объекта), а значение указатель на метод создания конкретной реализации.
Если про джаву то это например, енум который сам по себе является ключом а переопределенные методы в нем создают конкретную реализацию.
Re[4]: Фабричный метод
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 18.07.12 08:35
Оценка:
Здравствуйте, Stormblast, Вы писали:

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


Z>>Можете показать вариант с ключем? Ну или что имеется ввиду?


S>Если говорить про С++ то это регистрация в фабрике в статической мапе, где ключ константа(код объекта), а значение указатель на метод создания конкретной реализации.

Т.е. тот, кто хочет создаваться через фабрику должен сам же в этой фабрике зарегистрироваться?
Sic luceat lux!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.