Когда и как использовать шаблоны проектирования Factory и Builder

При разработке программного обеспечения шаблоны проектирования обеспечивают проверенные решения распространенных проблем программирования. Два популярных шаблона проектирования, Factory и Builder, широко используются для создания гибких и удобных в сопровождении объектов. В этой статье мы рассмотрим, когда и как эффективно использовать эти шаблоны. Мы обсудим различные варианты использования и приведем примеры кода, иллюстрирующие их реализацию.

  1. Шаблон проектирования «Фабрика».
    Шаблон проектирования «Фабрика» используется, когда мы хотим создавать объекты, не подвергая логику создания экземпляров непосредственно клиентскому коду. Он обеспечивает централизованную точку создания экземпляров и позволяет легко расширять и поддерживать код.

Пример.
Давайте рассмотрим сценарий, в котором у нас есть разные типы транспортных средств, например автомобили, мотоциклы и велосипеды. Мы можем использовать шаблон Factory для создания этих транспортных средств на основе запрошенного типа.

public interface Vehicle {
    void drive();
}
public class Car implements Vehicle {
    @Override
    public void drive() {
        System.out.println("Driving a car...");
    }
}
public class Motorcycle implements Vehicle {
    @Override
    public void drive() {
        System.out.println("Riding a motorcycle...");
    }
}
public class Bicycle implements Vehicle {
    @Override
    public void drive() {
        System.out.println("Riding a bicycle...");
    }
}
public class VehicleFactory {
    public Vehicle createVehicle(String type) {
        if (type.equalsIgnoreCase("car"))
            return new Car();
        else if (type.equalsIgnoreCase("motorcycle"))
            return new Motorcycle();
        else if (type.equalsIgnoreCase("bicycle"))
            return new Bicycle();

        return null;
    }
}
public class Main {
    public static void main(String[] args) {
        VehicleFactory factory = new VehicleFactory();

        Vehicle car = factory.createVehicle("car");
        car.drive();  // Output: Driving a car...

        Vehicle motorcycle = factory.createVehicle("motorcycle");
        motorcycle.drive();  // Output: Riding a motorcycle...

        Vehicle bicycle = factory.createVehicle("bicycle");
        bicycle.drive();  // Output: Riding a bicycle...
    }
}

В приведенном выше примере VehicleFactoryдействует как фабричный класс, инкапсулирующий логику создания. Клиентский код запрашивает у завода конкретный тип транспортного средства, который возвращает соответствующий объект.

  1. Шаблон проектирования Builder.
    Шаблон проектирования Builder используется, когда нам нужно шаг за шагом создавать сложные объекты, обеспечивая четкое разделение между построением и представлением. Это особенно полезно при работе с объектами со множеством необязательных параметров.

Пример.
Рассмотрим сценарий, в котором мы хотим создать объект Userс различными дополнительными атрибутами, такими как имя, возраст, адрес электронной почты и адрес. Шаблон Builder позволяет нам создавать объект Userв удобной и читаемой форме.

public class User {
    private String name;
    private int age;
    private String email;
    private String address;

    private User(UserBuilder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.email = builder.email;
        this.address = builder.address;
    }
// Getters for User attributes

    // Builder class
    public static class UserBuilder {
        private String name;
        private int age;
        private String email;
        private String address;

        public UserBuilder(String name) {
            this.name = name;
        }

        public UserBuilder age(int age) {
            this.age = age;
            return this;
        }

        public UserBuilder email(String email) {
            this.email = email;
            return this;
        }

        public UserBuilder address(String address) {
            this.address = address;
            return this;
        }

        public User build() {
            return new User(this);
        }
    }
}
public class Main {
    public static void main(String[] args) {
        User user = new User.UserBuilder("John")
                        .age(25)
                        .email("john@example.com")
                        .address("123 Main St")
                        .build();

        // Accessing user attributes
        System.out.println("Name: " + user.getName());
        System.out.println("Age: " + user.getAge());
        System.out.println("Email: " + user.getEmail());
        System.out.println("Address: " + user.getAddress());
    }
}

В приведенном выше примере класс Userимеет вложенный класс UserBuilder, который предоставляет методы для установки необязательных атрибутов. Метод build()создает объект Userна основе предоставленных значений.

Шаблоны проектирования Factory и Builder — мощные инструменты разработки программного обеспечения. Шаблон Factory позволяет централизованно создавать объекты, а шаблон Builder облегчает создание сложных объектов со многими дополнительными параметрами. Понимая соответствующие варианты использования и эффективно реализуя эти шаблоны, разработчики могут создавать код, который будет более удобным в сопровождении, расширяемым и читабельным.