Введение:

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

Шаблон одиночного элемента:

Шаблон Singleton гарантирует, что класс имеет только один экземпляр, и обеспечивает глобальную точку доступа к нему. Этот шаблон удобен, когда вам нужен один общий экземпляр объекта в вашем приложении. Реальные примеры включают подключения к базам данных, пулы потоков и системы ведения журналов.

public class Singleton {
    private static Singleton instance;
  
    private Singleton() {
        // Private constructor to prevent instantiation.
    }
  
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized(Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

Заводской шаблон:

Шаблон Factory предоставляет интерфейс для создания объектов без указания их конкретных классов. Он инкапсулирует логику создания объектов, обеспечивая гибкость и слабую связанность. Рассмотрим сценарии, в которых вам необходимо создавать различные типы объектов на основе определенных условий или параметров.

public interface Vehicle {
    void manufacture();
}

public class Car implements Vehicle {
    @Override
    public void manufacture() {
        System.out.println("Car manufactured.");
    }
}

public class Bike implements Vehicle {
    @Override
    public void manufacture() {
        System.out.println("Bike manufactured.");
    }
}

public class VehicleFactory {
    public static Vehicle createVehicle(String type) {
        if (type.equalsIgnoreCase("car")) {
            return new Car();
        } else if (type.equalsIgnoreCase("bike")) {
            return new Bike();
        }
        return null;
    }
}

Шаблон наблюдателя:

Паттерн Observer устанавливает зависимость между объектами «один ко многим», когда изменения в одном объекте вызывают обновления в нескольких зависимых объектах. Этот шаблон полезен, когда вам нужно поддерживать согласованность между объектами или уведомлять их об определенных событиях.

public interface Observer {
    void update();
}

public class StockObserver implements Observer {
    @Override
    public void update() {
        System.out.println("Stock price updated. Refreshing stock market data...");
    }
}

public class WeatherObserver implements Observer {
    @Override
    public void update() {
        System.out.println("Weather forecast updated. Displaying new weather information...");
    }
}

public class Subject {
    private List<Observer> observers = new ArrayList<>();
  
    public void addObserver(Observer observer) {
        observers.add(observer);
    }
  
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
  
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update();
        }
    }
}

Шаблон декоратора:

Шаблон Decorator позволяет расширить динамическое поведение объекта, добавляя в него дополнительную функциональность во время выполнения. Этот шаблон продвигает принцип открытого-закрытого дизайна, позволяя добавлять новые поведения без изменения существующего кода.

public interface UIComponent {
    void draw();
}

public class Button implements UIComponent {
    @Override
    public void draw() {
        System.out.println("Drawing a button");
    }
}

public abstract class UIComponentDecorator implements UIComponent {
    protected UIComponent decoratedComponent;
  
    public UIComponentDecorator(UIComponent decoratedComponent) {
        this.decoratedComponent = decoratedComponent;
    }
  
    @Override
    public void draw() {
        decoratedComponent.draw();
    }
}

public class BorderDecorator extends UIComponentDecorator {
    public BorderDecorator(UIComponent decoratedComponent) {
        super(decoratedComponent);
    }
  
    @Override
    public void draw() {
        super.draw();
        drawBorder();
    }
  
    private void drawBorder() {
        System.out.println("Drawing a border around the component");
    }
}

Шаблон стратегии:

Шаблон Strategy определяет семейство взаимозаменяемых алгоритмов и инкапсулирует каждый алгоритм отдельно. Он позволяет динамически переключаться между различными алгоритмами в зависимости от конкретных требований.

public interface PaymentStrategy {
    void pay(double amount);
}

public class CreditCardPaymentStrategy implements PaymentStrategy {
    private String cardNumber;
    private String cvv;
  
    public CreditCardPaymentStrategy(String cardNumber, String cvv) {
        this.cardNumber = cardNumber;
        this.cvv = cvv;
    }
  
    @Override
    public void pay(double amount) {
        System.out.println("Paying " + amount + " with credit card " + cardNumber);
    }
}

public class PayPalPaymentStrategy implements PaymentStrategy {
    private String email;
    private String password;
  
    public PayPalPaymentStrategy(String email, String password) {
        this.email = email;
        this.password = password;
    }
  
    @Override
    public void pay(double amount) {
        System.out.println("Paying " + amount + " with PayPal account " + email);
    }
}

public class PaymentContext {
    private PaymentStrategy paymentStrategy;
  
    public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }
  
    public void processPayment(double amount) {
        paymentStrategy.pay(amount);
    }
}

Вывод:

Шаблоны проектирования — бесценный инструмент для разработчиков программного обеспечения, предлагающий проверенные решения распространенных задач программирования. В этой статье мы рассмотрели пять широко используемых шаблонов проектирования в Java — Singleton, Factory, Observer, Decorator и Strategy — предоставив реальные примеры и варианты использования для каждого шаблона. Понимая и применяя эти шаблоны, вы можете улучшить ремонтопригодность, возможность повторного использования и гибкость вашего Java-кода. Начните использовать эти мощные шаблоны проектирования в своих проектах и ​​раскройте их преимущества уже сегодня!