GOF рассказывает о фреймворках для шаблона «Фабричный метод».Фреймворки нуждаются в объектах, но реализация объектов зависит от приложения, поэтому создается абстрактный метод для создания объекта.Кроме того, так как тип возвращаемого значения необходим для определения необходимого интерфейса для объекта, он определяет API, необходимые для объекта.Актуальные объекты создаются подклассами (конкретное приложение).Это шаблон создания.
Для шаблона шаблонное изменение состоит только в том, что инкапсулирующий класс не знает реализацию определенного поведения, поэтому он абстрагирует его в методе, использует его, но оставляет реализацию подклассам.Это поведенческий паттерн.
Единственными отличиями между ними являются
1. Factory method is creational and Template is behavioural.
2. Factory method abstracts a method to create an object where as template pattern abstracts a method for some policy or algorithm.
пример кода
/**factory-method example**/
public abstract class Application{
public void create(){
View contentView = createContentView();
Menu menu = contentView.obtainMenu();
generateMenuItems(menu);
}
public abstract View createContentView(); //factory-method
public void generateMenuItems(Menu menu){
// some code
}
}
/** Product Specification**/
public interface View{
public abstract Menu obtainMenu();
// other abstract method of product
}
Теперь код пользователя, использующийся выше, создаст подкласс Application и обеспечит реализацию для createContentView()
.
Базовая характеристика метода шаблона: конкретный метод родительского класса, вызывающий его абстрактный метод.
Метод фабрики: позволяет реализовать создание продукта его подклассами.
Приведенный выше пример подходит дляи то и другое.Фактически любой пример для методов Factory подходит и для метода Template.
Так что хорошо бы сказать
- Шаблон фабричного метода - это специализированный шаблонный шаблон для получения объекта, реализация которого зависит от пользовательского кода, который может обеспечить реализацию создания объектав подклассе
- Шаблон шаблона, если для создания объекта используется шаблон Фабрика.
Мое второе сомнение :для фабричного метода (который согласно GOF основан на инбертентности) обязательно вызывать его метод производства абстрактного продукта из своего другого конкретного метода?
Если ответом на выше является «Нет», то это означает, что будет какой-то потребителькод, который будет иметь экземпляр типа Factory (состав), вызовет метод factory для получения объекта продукта и получит конкретный класс фабрики.Но теперь это становится абстрактной фабрикой.