Шаблон проектування Factory в Java: Повний посібник з прикладами
Шаблон проектування Factory є основою програмного дизайну, відносяться до категорії креаційних шаблонів проектування. Він надає механізм створення об'єктів без розкриття логіки створення клієнту. Замість цього, шаблон дозволяє клієнту взаємодіяти через загальний інтерфейс або суперклас, що робить код більш модульним і легким для підтримки.
У цій статті ми детально розглянемо шаблон Factory, зрозуміємо його переваги і побачимо, як реалізувати його в Java на практиці. Незалежно від того, чи ви новачок у шаблонах проектування чи хочете вдосконалити свої навички, цей посібник допоможе вам розкрити потенціал шаблону Factory.
Що таке шаблон проектування Factory?
Шаблон Factory абстрагує процес створення об'єктів, делегуючи його фабричному класу або методу. Це розв'язує клієнтський код від конкретних класів реалізацій і забезпечує більшу гнучкість та масштабованість.
Наприклад, у додатках, де створюються об'єкти різних типів (наприклад, фігури або транспортні засоби) на основі вводу користувача, вбудовування логіки створення в клієнтський код може призвести до сильного зчеплення. Шаблон Factory вирішує цю проблему, централізуючи логіку створення в одному місці.
Ключові особливості шаблону Factory
- Інкапсуляція: Інкапсулює логіку створення об'єктів у фабричному класі або методі.
- Слабка зв'язаність: Клієнтський код взаємодіє з інтерфейсом або абстрактним класом, а не з конкретними реалізаціями.
- Розширюваність: Додавання нових типів об'єктів є простим без зміни існуючого клієнтського коду.
Типи шаблонів Factory
- Простий Factory: Використовує один фабричний клас для створення різних типів об'єктів.
- Фабричний метод: Дозволяє підкласам визначати, який об'єкт створювати.
- Абстрактна фабрика: Створює сімейства пов'язаних об'єктів без вказівки їх конкретних класів.
Ця стаття зосереджена на шаблонах Простий Factory та Фабричний метод.
Реалізація шаблону Factory в Java
1. Простий Factory
Шаблон Простий Factory централізує процес створення об'єктів в одному класі.
Приклад: Фабрика Фігур
# Крок 1: Визначення загального інтерфейсу
interface Shape {
void draw();
}
# Крок 2: Реалізація конкретних класів
class Circle implements Shape {
@Override
public void draw() {
System.out.println("Малюємо Коло");
}
}class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Малюємо Прямокутник");
}
}class Square implements Shape {
@Override
public void draw() {
System.out.println("Малюємо Квадрат");
}
}# Крок 3: Створення Фабрики
class ShapeFactory {
public Shape getShape(String shapeType) {
if (shapeType == null) {
return null;
}
switch (shapeType.toLowerCase()) {
case "circle":
return new Circle();
case "rectangle":
return new Rectangle();
case "square":
return new Square();
default:
throw new IllegalArgumentException("Невідомий тип фігури: " + shapeType);
}
}
}# Крок 4: Використання Фабрики
public class Main {
public static void main(String[] args) {
ShapeFactory shapeFactory = new ShapeFactory(); Shape circle = shapeFactory.getShape("circle");
circle.draw(); Shape rectangle = shapeFactory.getShape("rectangle");
rectangle.draw(); Shape square = shapeFactory.getShape("square");
square.draw();
}
}
Виведення:
Малюємо Коло
Малюємо Прямокутник
Малюємо Квадрат
2.
Фабричний метод
Шаблон проектування Factory Method делегує створення об'єктів підкласам, надаючи більше гнучкості.
Приклад: Фабрика Тварин
# Крок 1: Визначення загального інтерфейсу
interface Animal {
void speak();
}
# Крок 2: Реалізація конкретних класів
class Dog implements Animal {
@Override
public void speak() {
System.out.println("Гав!");
}
}class Cat implements Animal {
@Override
public void speak() {
System.out.println("Мяу!");
}
}# Крок 3: Визначення абстрактної фабрики
abstract class AnimalFactory {
public abstract Animal createAnimal();
}# Крок 4: Реалізація конкретних фабрик
class DogFactory extends AnimalFactory {
@Override
public Animal createAnimal() {
return new Dog();
}
}class CatFactory extends AnimalFactory {
@Override
public Animal createAnimal() {
return new Cat();
}
}# Крок 5: Використання фабрик
public class Main {
public static void main(String[] args) {
AnimalFactory dogFactory = new DogFactory();
Animal dog = dogFactory.createAnimal();
dog.speak(); AnimalFactory catFactory = new CatFactory();
Animal cat = catFactory.createAnimal();
cat.speak();
}
}
Виведення:
Гав!
Мяу!
Переваги шаблону Factory
- Спрощує створення об'єктів: Інкапсулює логіку створення об'єктів в одному місці.
- Сприяє слабкому зчепленню: Клієнтський код залежить від абстракцій, а не від конкретних класів.
- Сприяє масштабованості коду: Додавання нових типів об'єктів не впливає на існуючий клієнтський код.
Недоліки шаблону Factory
- Складність: Шаблон Factory може ввести зайву складність у простих випадках.
- Витрати на підтримку: Погано спроектована фабрика може стати вузьким місцем.
- Багатослівність коду: Вимагає додаткових класів або методів для фабрик та інтерфейсів.
Коли використовувати шаблон Factory
- Коли точний тип об'єкта, що створюється, визначається під час виконання.
- Коли створення об'єктів включає складну логіку, яку краще інкапсулювати.
- Коли код повинен залишатися відкритим для розширення, але закритим для модифікації (Принцип відкритості/закритості).
Висновок
Шаблон проектування Factory — це універсальний та потужний інструмент, який спрощує створення об'єктів і сприяє більш чистому та підтримуваному коду. Незалежно від того, чи працюєте ви з фігурами, тваринами або підключеннями до баз даних, шаблон Factory забезпечує масштабованість і гнучкість вашого дизайну.
Централізуючи створення об'єктів, цей шаблон полегшує дотримання принципів програмної інженерії, таких як слабке зчеплення та повторне використання коду. Однак, як і всі шаблони, його слід використовувати обережно, щоб уникнути зайвої складності.
Чи реалізували ви шаблон Factory у своїх проектах? Поділіться своїм досвідом та думками в коментарях нижче!
Успіхів у програмуванні! 🚀
Перекладено з: The Factory Design Pattern | Guide with Examples