Каковы преимущества шаблона фабричного метода помимо подклассов? - PullRequest
2 голосов
/ 07 февраля 2012

При использовании структуры .NET Color мне стало интересно, почему Microsoft решила использовать шаблон фабричного метода для этой структуры (зная, что шаблон фабричного метода в основном используется для создания подклассов и что структуры не могут быть разделены на подклассы).

Я дал Википедии попытку. Это подтвердило мои мысли, фактически не выдав ответ:

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

Итак, скажите мне, каковы эти другие преимущества шаблона фабричного метода?

Например, как я могу выиграть от звонка Color myColor = Color.FromArgb(255,255,255) вместо Color myColor = new Color(255,255,255)?

(обратите внимание, что второй метод на самом деле невозможен, поскольку структура Point не имеет параметризованного конструктора из-за используемого им шаблона фабричного метода)

Ответы [ 5 ]

1 голос
/ 08 февраля 2012

Эта цитата из msdn предлагает цель:

Когда вы создаете объект структуры с помощью оператора new, он создается и вызывается соответствующий конструктор.В отличие от классов, структуры могут быть созданы без использования оператора new.Если вы не используете new, поля останутся неназначенными, и объект нельзя будет использовать до тех пор, пока все поля не будут инициализированы.

Шаблон фабричного метода в контексте структуры .NET, предотвращает неинициализированные экземпляры .

1 голос
/ 07 февраля 2012

Основная причина, по которой я использую такой метод, заключается в том, что они фактически названы конструкторами.Например, для Color порядок указания компонентов не очевиден без имени.Обычно используется ARGB, но иногда вы также видите BGRA или даже совсем другое цветовое пространство, такое как HSV.Помещение используемого порядка цветов в имя метода делает код более самодокументируемым.

Еще одно преимущество заключается в том, что статические методы поддерживают вывод типов.Например, с Tuple<...> вы можете просто использовать Tuple.Create(1,5) вместо более подробного new Tuple<int,int>(1,5).

1 голос
/ 07 февраля 2012

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

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

Таким образом, CodeInChaos указал, что в данном случае это действительно именованный конструктор - но может , но физическая зависимость все еще может быть абстрагированнойпо этому сценарию? ДА! .Давайте создадим пример сценария с использованием цветов.

Допустим, есть класс, который определяет цвет.Этот класс имеет несколько специализаций и различных членов, чтобы точно представлять каждую доступную специализацию цвета - скажем, оттенки серого, RGB и CMYK.Наивный метод преобразования уже способен создавать недопустимые цвета.С фабричным методом вы можете использовать тип для абстрагирования этой сложности, запрашивая тип произвольного цвета для преобразования его цветовой моделью.То есть преобразование преобразования RGBA в оттенки серого является одной функцией, а преобразование CMYK в RGBA - другой функцией.Абстрактное представление цвета может иметь метод с именем asRGBA() для обработки этого преобразования, где каждая специализация или подтип может предлагать совершенно разные реализации преобразования.

Хорошо, это абстрагирует некоторую сложность и сохраняет все наши цвета легальными(RGB не может представлять все значения CMYK).Кажется слишком сложным? Нет .На самом деле цветовых представлений больше.Кроме того, существуют цветовые профили, которые могут быть специфическими для устройств (например, монитора) или специфическими для других целей (например, подключенного принтера).Функции преобразования для этих профилей намного сложнее.

Для базового представления цвета нам нужно будет ввести много зависимостей для обработки всех этих устройств и целей.Хорошо продуманные фабричные методы могут абстрагировать все это и использовать оптимизированные реализации для этих преобразований, уменьшая при этом зависимости.

Это надуманный пример (я не разработчик C #), но он иллюстрирует, как фабричные методы могут использоватьсяуменьшить сложность и минимизировать зависимости.

0 голосов
/ 07 февраля 2012

Я не думаю, что термин "фабричные методы" обычно используется для обозначения методов, которые возвращают структуру, поскольку все методы, которые возвращают структуру, возвращают экземпляр, который ранее не существовал ( по иронии судьбы, конструкторы структуры, вызываемые из vb.net).

0 голосов
/ 07 февраля 2012

Можете ли вы объяснить больше? Какая часть реализации структуры Color является фабрикой?

Кроме того, похоже, что вы не соответствуете шаблонам "Factory" AKA (Абстрактная фабрика) и "Factory Method". Оба являются творческими образцами. Но они разные и используются для разных целей.

Ref

http://en.wikipedia.org/wiki/Software_design_pattern
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...