- Шаблон Singleton:
Представьте, что вы на вечеринке, и музыку контролирует только один диджей. Шаблон Singleton гарантирует, что в вашем приложении будет только один экземпляр класса. Это похоже на диджейскую будку, к которой каждый может получить доступ, что обеспечивает стабильное воспроизведение музыки.
public class DJBooth {
private static DJBooth instance;
private DJBooth() {
// Private constructor to prevent external instantiation
}
public static synchronized DJBooth getInstance() {
if (instance == null) {
instance = new DJBooth();
}
return instance;
}
// Other DJBooth methods...
}
- Шаблон наблюдателя:
Представьте, что вы подписаны на рассылку новостей и при появлении новой статьи вы получаете уведомление. Шаблон Observer устанавливает связь «один ко многим» между объектами, при которой субъект (информационный бюллетень) уведомляет своих наблюдателей (подписчиков) при изменении своего состояния.
public interface Observer {
void update();
}
public interface Subject {
void attach(Observer observer);
void detach(Observer observer);
void notifyObservers();
}
public class Newsletter implements Subject {
private List<Observer> subscribers = new ArrayList<>();
public void attach(Observer observer) {
subscribers.add(observer);
}
public void detach(Observer observer) {
subscribers.remove(observer);
}
public void notifyObservers() {
for (Observer observer : subscribers) {
observer.update();
}
}
// Other Newsletter methods...
}
- Заводской шаблон:
Представьте, что вы любитель пиццы и заказываете пиццу в разных ресторанах. Шаблон Factory предоставляет интерфейс для создания объектов, но конкретный экземпляр подкласса определяется фабрикой (рестораном), а не клиентом (вами).
public interface Pizza {
void prepare();
void bake();
void box();
}
public class MargheritaPizza implements Pizza {
public void prepare() {
System.out.println("Preparing Margherita pizza...");
}
public void bake() {
System.out.println("Baking Margherita pizza...");
}
public void box() {
System.out.println("Boxing Margherita pizza...");
}
}
public class PepperoniPizza implements Pizza {
public void prepare() {
System.out.println("Preparing Pepperoni pizza...");
}
public void bake() {
System.out.println("Baking Pepperoni pizza...");
}
public void box() {
System.out.println("Boxing Pepperoni pizza...");
}
}
public class PizzaFactory {
public Pizza createPizza(String type) {
if (type.equals("Margherita")) {
return new MargheritaPizza();
} else if (type.equals("Pepperoni")) {
return new PepperoniPizza();
}
return null;
}
}
- Шаблон декоратора:
Представьте, что у вас есть простой кофе, и вы хотите добавить в него дополнительные ароматизаторы или начинки, чтобы улучшить его вкус. Паттерн «Декоратор» позволяет динамически добавлять к объекту новые варианты поведения или функции без изменения его структуры.
public interface Coffee {
String getDescription();
double getCost();
}
public class SimpleCoffee implements Coffee {
public String getDescription() {
return "Simple coffee";
}
public double getCost() {
return 1.0;
}
}
public abstract class CoffeeDecorator implements Coffee {
protected Coffee decoratedCoffee;
public CoffeeDecorator(Coffee decoratedCoffee) {
this.decoratedCoffee = decoratedCoffee;
}
public String getDescription() {
return decoratedCoffee.getDescription();
}
public double getCost() {
return decoratedCoffee.getCost();
}
}
public class MilkDecorator extends CoffeeDecorator {
public MilkDecorator(Coffee decoratedCoffee) {
super(decoratedCoffee);
}
public String getDescription() {
return super.getDescription() + ", with milk";
}
public double getCost() {
return super.getCost() + 0.5;
}
}
public class CaramelDecorator extends CoffeeDecorator {
public CaramelDecorator(Coffee decoratedCoffee) {
super(decoratedCoffee);
}
public String getDescription() {
return super.getDescription() + ", with caramel";
}
public double getCost() {
return super.getCost() + 0.8;
}
}
В этой статье мы рассмотрели четыре популярных шаблона проектирования: Singleton, Observer, Factory и Decorator. Эти шаблоны предоставляют мощные решения распространенных проблем разработки программного обеспечения. Понимая и применяя эти шаблоны, вы можете улучшить структуру, удобство сопровождения и возможность повторного использования вашего кода.
Помните, шаблоны проектирования — это инструменты в вашем наборе инструментов разработки. Очень важно правильно подобрать модель для конкретной ситуации. Итак, продолжайте практиковаться, экспериментировать и расширять свои знания о шаблонах проектирования. Приятного кодирования!