Найти в Дзене
Andy Green

Шаблон проектирования - Фабричный метод.

Шаблон проектирования "Фабричный метод" (Factory Method) относится к паттернам создания объектов. Он предоставляет интерфейс для создания объектов в суперклассе, но делегирует фактическое создание конкретных объектов подклассам. Таким образом, фабричный метод позволяет классам-потомкам решать, какие конкретные объекты создавать.

Принцип работы шаблона "Фабричный метод" выглядит следующим образом:

  1. Определение абстрактного класса (или интерфейса), который представляет общий интерфейс для всех создаваемых объектов.
  2. Создание абстрактного метода "фабричного метода" в этом классе. Этот метод будет возвращать экземпляр созданного объекта.
  3. Создание конкретных классов-потомков, реализующих абстрактный класс.
  4. Каждый конкретный класс-потомок реализует свой собственный фабричный метод, который создает соответствующий объект.
  5. Клиентский код вызывает фабричный метод для создания объекта, не зная конкретного класса, который будет создан.

Пример использования шаблона "Фабричный метод" может быть следующим. Представим, что у нас есть абстрактный класс Animal с абстрактным методом makeSound(). У нас также есть два конкретных класса-потомка Dog и Cat, которые реализуют метод makeSound() соответствующим образом.

abstract class Animal {
public abstract void makeSound();
}

class Dog extends Animal {
public void makeSound() {
System.out.println("Woof!");
}
}

class Cat extends Animal {
public void makeSound() {
System.out.println("Meow!");
}
}

Далее мы создаем абстрактный метод "фабричный метод" createAnimal() в абстрактном классе Animal, а затем реализуем его в каждом конкретном классе:

abstract class Animal {
public abstract void makeSound();

public void doSomething() {
Animal animal = createAnimal();
animal.makeSound();
}

protected abstract Animal createAnimal();
}

class Dog extends Animal {
public void makeSound() {
System.out.println("Woof!");
}

protected Animal createAnimal() {
return new Dog();
}
}

class Cat extends Animal {
public void makeSound() {
System.out.println("Meow!");
}

protected Animal createAnimal() {
return new Cat();
}
}

Теперь мы можем создавать объекты Animal с помощью фабричного метода createAnimal() без прямого указания конкретного класса.

Использование шаблона "Фабричный метод" позволяет нам расширять функциональность, добавляя новые конкретные классы-потомки, не изменяя клиентского кода. Например, мы можем создать новый класс Lion, который также наследует от Animal и реализует свой фабричный метод:

class Lion extends Animal {
public void makeSound() {
System.out.println("Roar!");
}

protected Animal createAnimal() {
return new Lion();
}
}

Теперь, если нам нужно создать объект Lion, мы можем просто вызвать фабричный метод createAnimal() в классе Animal, и он автоматически создаст и вернет экземпляр Lion.

Animal lion = new Lion();
lion.makeSound(); // Выводит "Roar!"

Таким образом, шаблон "Фабричный метод" обеспечивает гибкость и расширяемость при создании объектов, позволяя делегировать процесс создания подклассам. Это полезно, когда необходимо создавать объекты различных типов, но интерфейс остается общим для всех создаваемых объектов.

Применение шаблона "Фабричный метод" помогает соблюдать принципы SOLID (например, принцип открытости/закрытости), улучшает читаемость и поддерживаемость кода, а также способствует разделению ответственности между классами.