Когда я должен использовать фабрику, чтобы обернуть конструктор в Perl? - PullRequest
1 голос
/ 31 марта 2010

Зачем использовать фабрику для переноса конструктора в Perl? Пример поможет.

Ответы [ 2 ]

5 голосов
/ 31 марта 2010

Обычное использование Фабрики - это создание объекта, когда вы не знаете, какой тип вам нужен заранее. Фабрика определяет, какой конструктор вызывать в зависимости от ситуации.

В качестве примера предположим, что вы хотите создать класс для загрузки файлов, но заранее не знаете, как можно получить файл. Может быть, это FTP, HTTP, SVN или что-то еще. У вас есть класс Downloader, который берет URL любого типа и дает вам объект:

 my $object = Downloader->new( $some_url );

Вы не знаете тип этого объекта, но вам все равно. Все создаваемые им объекты знают, как реагировать на store_in_directory, поэтому вы вызываете метод, не зная тип конкретного объекта:

 $object->store_in_directory( $dir );

И вот, пожалуйста. Фабрика new позволяет подклассам (или что-то еще) создавать $object. Это упрощает интерфейс, потому что на уровне приложения вам не нужно выбирать правильный класс.

Одна из приятных особенностей Perl заключается в том, что вам не нужно жестко кодировать имена классов. Вы можете сделать что-то вроде этого, где вы используете строку, определенную во время выполнения, для создания объекта:

 sub new {
      my( $class, @args ) = @_;

      my $output_class = $class->choose_the_right_implementing_class;

      my $output_object = $output_class->new;
      }
5 голосов
/ 31 марта 2010

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

См. http://en.wikipedia.org/wiki/Factory_method_pattern

Фабричные методы распространены в наборах инструментов и средах, где код библиотеки необходимо создавать объекты типов, которые могут быть разделены на приложения используя рамки.

Параллельные иерархии классов часто требовать объекты из одной иерархии в уметь создавать соответствующие объекты от другого.

Заводские методы используются в разработка через тестирование, чтобы позволить классы, подлежащие проверке [2]. Если такой класс Foo создает другой Опасный объект, который нельзя поставить при автоматизированных модульных тестах (возможно, это общается с производством база данных, которая не всегда доступна), затем создание опасных объектов находится на виртуальной фабрике метод createDangerous в классе Foo. Для тестирования, TestFoo (подкласс Foo) затем создается с виртуальным фабричный метод createDangerous переопределено для создания и возврата FakeDangerous, поддельный объект. Единица измерения тесты, а затем использовать TestFoo для проверки функциональность Foo без понесения побочный эффект от использования реального Опасный объект.

Более подробная информация о фабричном шаблоне Perl:

http://www.perl.com/pub/a/2003/08/15/design3.html

и

http://www.perldesignpatterns.com/?FactoryObject

...