Фабричный метод режим
Мотивация для создания объекта часто требует сложного процесса, поэтому он не подходит для включения на композитную фабрику. Когда есть новые продукты, необходимо изменять композитный завод, что не способствует расширению.
Более того, создание некоторых объектов может потребовать информации, к которой не может быть доступна композитная фабрика. Следовательно, определите заводский интерфейс и определите, какой продукт создается созданием путем реализации этого интерфейса. Это заводской метод, который задерживает экземпляр класса для подкласса.
Цель
1. Определите интерфейс и позвольте подклассу решить, какой продукт экземплятся.
2. Создать объекты через общий интерфейс.
выполнить
1. Интерфейс продукта и конкретные продукты просты для понимания.
2. Заводский класс предоставляет фабричный метод, который возвращает объект продукта. Но этот фабричный метод абстрактный.
3. Внедрить заводские методы на конкретных заводах и завершить создание конкретных продуктов.
// Кнопка класса кнопок класса {/* ...*/} Класс WinButton Extends Кнопка {/* ...*/} Class MacButton Extends Кнопка {/* ...*/} // Их интерфейс -интерфейс класса класса {Abstract Button CreateButton (); } класс WinButtonFactory реализует ButtonFactory {button CreateButton () {return new winButton (); }} класс MacButtonFactory реализует ButtonFactory {button CreateButton () {return new MacButton (); }} Применимые сценарии
1. Когда при создании объекта есть больше дублированного кода, вы можете рассмотреть возможность использования шаблона метода заводского метода для выполнения этих дублирующихся частей.
2. Создание объекта требует доступа к определенной информации, которая не должна быть включена в класс заводов. Затем подклассы могут реализовать создание объекта.
3. Когда вам нужно централизованно управлять созданием объектов, чтобы поддерживать последовательность программы.
Абстрактная заводская шаблон
Определение абстрактных заводских шаблонов дает способ инкапсулировать набор отдельных заводов с той же темой. При обычном использовании клиентская программа должна создать конкретную реализацию абстрактной фабрики, а затем использовать абстрактную фабрику в качестве интерфейса для создания конкретного объекта для этой темы. Клиентская программа не должна знать (или заботиться), что она получает конкретный тип объектов из этих внутренних методов завода, поскольку клиентская программа использует только общий интерфейс этих объектов. Абстрактная заводская шаблон отделяет детали реализации набора объектов от их общего использования.
«Фабрика» - это то, где создаются продукты (объекты), и его цель - отделить создание продуктов от их использования. Цель абстрактной заводской модели состоит в том, чтобы отделить интерфейсы нескольких абстрактных продуктов от конкретной реализации различных тематических продуктов. Таким образом, при добавлении новой конкретной фабрики вам не нужно изменять код клиента, который ссылается на абстрактную фабрику.
Использование абстрактного заводского шаблона позволяет изменить конкретную завод, не изменяя клиент -код, используя завод, даже во время выполнения. Однако использование этого шаблона или аналогичных шаблонов проектирования может привести к ненужной сложности и дополнительной работе для написания кода. Правильное использование дизайнерских шаблонов может компенсировать такую «дополнительную работу».
выполнить
1. AbstractFactory - определяет метод интерфейса для создания абстрактных продуктов.
2. ConcreteFactory - реализовать метод создания конкретных продуктов.
3. AbstractProduct - интерфейс, который объявляет различные типы продуктов.
4. Продукт - Определите конкретные продукты, соответствующие ConcreteFactory и реализуйте интерфейс AbstractProduct.
5. Клиент - Использовать классы AbstractFactory и AbstractProduct.
Abstract Class AbstractProducta {Public Abstract void operailA1 (); Public Abstract void opronala2 (); } class producta1 Extens AbstractProducta {producta1 (String arg) {System.out.println ("hello"+arg); } // Реализовать код здесь public void anpormationA1 () {}; public void anpormationa2 () {}; } class Producta2 Extends AbstractProducta {ProductA2 (String arg) {System.out.println ("hello"+arg); } // Реализовать код здесь public void anpormationA1 () {}; public void anpormationa2 () {}; } Abstract Class AbstractProductb {// public Abstract void OperationB1 (); // public Abstract void OperationB2 (); } класс ProductB1 Extends AbstractProductb {ProductB1 (String arg) {System.out.println ("hello"+arg); } // Реализовать код здесь} класс productb2 extends AbstractProductb {ProductB2 (String arg) {System.out.println ("hello"+arg); } // Реализовать код здесь} абстрактный класс AbstractFactory {AbstractProducta createProducta (); Abstract AbstractProductb createProductb (); } class concreteFactory1 Extens AbstractFactory {AbstractProducta createProducta () {return new producta1 ("producta1"); } AbstractProductb createProductb () {return new ProductB1 ("ProductB1"); }} класс ConcreteFactory2 Extends AbstractFactory {AbstractProducta createProducta () {return new producta2 ("procusa2"); } AbstractProductb createProductb () {return new ProductB2 ("ProductB2"); }} // Фабричный создатель - косвенный способ создания фабрики класса фабрики {частный статический абстрактный фактор pf = null; static AbstractFactory getFactory (string Choice) {if (Choice.equals ("a")) {pf = new ConcreteFactory1 (); } else if (choice.equals ("b")) {pf = new ConcreteFactory2 (); } вернуть PF; }} // клиент клиент Client {public static void main (string args []) {AbstractFactory pf = factoryMaker.getFactory ("a"); AbstractProducta product = pf.createProducta (); // больше вызовов функции по продукту}}В классе FactoryMaker используется простой заводской режим, в то время как реализация конкретных заводов использует режим заводского метода.
Применимые сценарии
1. Система не зависит от создания, состава и представления ее продуктов.
2. Когда система настроена одним из нескольких семейств продуктов.
3. Необходимо подчеркнуть дизайн серии связанных объектов продукта для совместного использования.
4. Предоставьте библиотеку продуктов и хотите отобразить свои интерфейсы вместо реализаций.
преимущество
1. Конкретные продукты отделены от кода клиента
2. Серия, которая может легко изменить
3. Создайте серию семейств продуктов вместе
недостаток
1. Трудно расширить новые продукты в семействе продуктов, это требует изменения интерфейсов абстрактной фабрики и конкретной фабрики.