Фабричный шаблон также является одним из наиболее часто используемых шаблонов среди 23 шаблонов проектирования, и эти 23 шаблона проектирования можно разделить на: творческий шаблон, структурный шаблон и поведенческий шаблон.Фабричный шаблон классифицируется как творческий шаблон.
В общем, фабричный режим можно разделить на три типа: простой фабричный режим, режим фабричного метода и абстрактный фабричный режим.Простой фабричный режим не является строго разновидностью фабричного режима, а привычкой программирования. В этой статье для сравнения и понимания в качестве шаблона используется простая фабрика.
Простой заводской шаблон
Шаблон Simple Factory заключается в том, что класс фабрики динамически решает, какой экземпляр класса продукта (эти классы продуктов наследуются от родительского класса или интерфейса) должен быть создан в соответствии с входящими параметрами. Общий шаблон простой фабрики также называется шаблоном статического метода фабрики (Static Factory Method), который относится к шаблону создания класса.
Далее мы продемонстрируем простой фабричный шаблон на простом примере. Сначала определите интерфейс Shape для рисования графики, который определяет метод рисования draw(). Circle Circle, Square Square и Rectangle Rectangle реализуют класс Shape, а затем реализуют собственный метод draw().
Мы вернем различные реализации Shape через фабричный класс ShapeFactory.
В дополнение к передаче типа типа существует еще один способ напрямую передать класс типа, который необходимо создать, а затем напрямую вернуть тип объекта Shape посредством отражения.
Вышеупомянутые два различных метода создания объектов похожи, и все они требуют создания различных типов объектов с помощью входного параметра.
преимуществоФабричный класс является ключом ко всему шаблону. Он содержит необходимое логическое суждение, чтобы решить, какой конкретный объект класса следует создать в соответствии с информацией, предоставленной внешним миром. Используя фабричный класс, внешний мир может избавиться от неловкой ситуации прямого создания конкретных объектов продукта, и ему нужно нести ответственность только за «потребление» объектов. Независимо от того, как эти объекты созданы и организованы. Уточняются соответствующие обязанности и права, что способствует оптимизации всей архитектуры программного обеспечения.
недостатокПоскольку фабричный класс концентрирует в себе логику создания всех экземпляров, он нарушает принцип распределения ответственности высокой связности, и всю логику создания концентрирует в одном фабричном классе; классы, которые он может создавать, можно только рассматривать заранее, а если нужны новые чтобы добавить класс, вам нужно изменить заводской класс. Когда количество определенных классов продуктов в системе продолжает увеличиваться, могут возникнуть требования к фабричному классу для создания разных экземпляров в соответствии с разными условиями. Такого рода суждения об условиях и суждения о конкретных типах продуктов переплетаются, и трудно избежать распространения модульных функций, что очень неблагоприятно для обслуживания и расширения системы.
сцены, которые будут использоваться
- Фабричный класс отвечает за создание меньшего количества объектов;
- Клиент знает только параметры, переданные в фабричный класс, и не заботится о том, как создать объект (логика);
Шаблон фабричного метода
Пусть подклассы решают, какой класс создавать, определяя интерфейс, который создает объект. Фабричные методы откладывают создание экземпляра класса до подклассов.
Диаграмма классов фабричных методов выглядит следующим образом:
Мы знаем, что в среде Android или Java Swing тема представления может быть установлена сама по себе, а цвет отображения полосы прокрутки отличается в темной и светлой теме. Предположим, класс сущности темы — это класс Theme, а затем определите интерфейс ThemeFactory для создания тем.В интерфейсе есть метод createTheme(), который возвращает экземпляр Theme. ScrollBar аналогичен описанному выше простому фабричному определению и реализует интерфейс Shape для переопределения метода рисования.
В соответствии с представлением на приведенной выше диаграмме классов уровень абстракции Theme в этом примере упрощен, но ConcreteProduct, используемый непосредственно, является Theme.
Реализуя ThemeFactory, мы определяем две темы: одну — светлую тему LightThemeFactory, а другую — темную тему DarkThemeFactory.
Затем протестируйте реализацию ScrollBar.
Если наша тема проходит через LightThemeFactory, то на выходе получается светящаяся полоса прокрутки.
Шаблон фабричного метода является наиболее часто используемым шаблоном в фабричном шаблоне.В JDK есть типичное определение инженерного метода:
И AsyncTask, и ThreadPoolExecutor в Android имеют реализацию этого фабричного метода, и код здесь публиковаться не будет.
Реализация подкласса ThemeFactory очень похожа на шаблон Simple Factory. Простой фабричный шаблон делает все в одном месте, тогда как фабричный метод создает структуру и позволяет подклассам решать, как ее реализовать. Например, метод createTheme() в фабричном методе обеспечивает общую основу для создания темы, а метод createTheme() опирается на конкретный класс, созданный фабричным методом, для создания конкретной темы. Вы можете решить, что представляет собой конкретная созданная тема, внедрив ThemeFactory. Простой фабричный подход может инкапсулировать создание объектов, но простая фабрика не обладает гибкостью фабричного метода, потому что простая фабрика не может изменить создаваемый продукт.
В приведенном выше примере шаблона фабричного метода фабрика определяется используемым интерфейсом, который может не очень часто использоваться в реальной разработке. Однако пример, представленный в книге "Шаблоны проектирования Head First", является более практичным. Если вам интересно, вы можете обратиться к нему. Книга описывает PizzaStore как абстрактный класс и определяет создание Pizza как абстрактный метод, позволяющий Подклассы решают, как производить пиццу.
сцены, которые будут использоваться
- Когда класс не знает класс объекта, который он должен создать.
- Когда класс хочет, чтобы его подклассы определяли объекты, которые он создает.
Абстрактный заводской узор
В фабричном методе, описанном выше, на фабрике производится только один продукт. Шаблон абстрактной фабрики всего на один шаг дальше фабричного метода, в этом шаблоне класс фабрики может создавать не только один продукт, но и группу продуктов.
Вот пример стиля отображения пользовательского интерфейса. В режиме фабричного метода было введено, что ScrollBar может отображать разные стили в соответствии с разными темами, а состав ScrollBar более детализирован и детализирован.Предположим, что при отрисовке ScrollBar ему необходимо отрисовывать свой фон Background и границу Border. Затем определите ThemeFactory, но этот ThemeFactory немного отличается от фабричного метода, он должен создать фон и границу.
Затем определите ScrollBar.В методе draw() ScrollBar вам нужно только вызвать методы draw() Background и Border для завершения рисования.
Класс реализации DarkThemeFactory для ThemeFactory выглядит следующим образом:
сцены, которые будут использоваться
- Когда система должна быть создана, составлена и представлена независимо от ее продуктов.
- Когда система должна быть сконфигурирована одной из нескольких производственных систем.
- Когда вы хотите подчеркнуть дизайн серии связанных продуктовых объектов для совместного использования.
- Когда вы предоставляете библиотеку классов продуктов, но хотите показать только их интерфейс, а не реализацию.
Все фабричные шаблоны используются для инкапсуляции создания объектов. Фабричный метод в основном делегирует создание объекта подклассу, а подкласс реализует фабричный метод для создания объекта. Абстрактные фабрики используют композицию объектов, которая предоставляет интерфейс для создания семейств связанных или зависимых объектов без указания явного класса.
использованная литература
Абстрактный заводской шаблон шаблона проектирования JAVA