Назад к вопросам
Junior
66
questionbank

С помощью какого паттерна проектирования в Java можно реализовать создание объекта?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Паттерн проектирования "Фабричный метод" (Factory Method).

Он определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанцировать. Он позволяет классу делегировать создание объектов подклассам.

// Интерфейс продукта
interface Product {
    void use();
}

// Конкретный продукт A
class ConcreteProductA implements Product {
    @Override
    public void use() {
        System.out.println("Using ConcreteProductA");
    }
}

// Конкретный продукт B
class ConcreteProductB implements Product {
    @Override
    public void use() {
        System.out.println("Using ConcreteProductB");
    }
}

// Создатель
abstract class Creator {
    // Фабричный метод
    abstract Product factoryMethod();

    // Бизнес-логика с использованием продукта
    void doSomething() {
        Product product = factoryMethod();
        product.use();
    }
}

// Конкретный создатель A
class ConcreteCreatorA extends Creator {
    @Override
    Product factoryMethod() {
        return new ConcreteProductA();
    }
}

// Конкретный создатель B
class ConcreteCreatorB extends Creator {
    @Override
    Product factoryMethod() {
        return new ConcreteProductB();
    }
}

Паттерн "Абстрактная фабрика" (Abstract Factory).

Он предоставляет интерфейс для создания семейства взаимосвязанных или взаимозависимых объектов без указания их конкретных классов.

// Абстрактная фабрика
interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

// Абстрактные продукты
interface ProductA {
    void useA();
}

interface ProductB {
    void useB();
}

// Конкретная фабрика 1
class ConcreteFactory1 implements AbstractFactory {
    @Override
    public ProductA createProductA() {
        return new ConcreteProductA1();
    }

    @Override
    public ProductB createProductB() {
        return new ConcreteProductB1();
    }
}

// Конкретная фабрика 2
class ConcreteFactory2 implements AbstractFactory {
    @Override
    public ProductA createProductA() {
        return new ConcreteProductA2();
    }

    @Override
    public ProductB createProductB() {
        return new ConcreteProductB2();
    }
}

// Конкретные продукты (попущено для краткости, например ConcreteProductA1, ConcreteProductA2, etc.)
// class ConcreteProductA1 implements ProductA { ... }
// class ConcreteProductA2 implements ProductA { ... }
// class ConcreteProductB1 implements ProductB { ... }
// class ConcreteProductB2 implements ProductB { ... }

Паттерн "Строитель" (Builder).

Он отделяет конструирование сложного объекта от его представления, так что один и тот же процесс конструирования может создавать различные представления.

// Класс, который нужно построить
class ComplexObject {
    private String partA;
    private int partB;
    private boolean partC;

    // Приватный конструктор
    private ComplexObject(Builder builder) {
        this.partA = builder.partA;
        this.partB = builder.partB;
        this.partC = builder.partC;
    }

    // Внутренний статический класс Builder
    static class Builder {
        private String partA;
        private int partB;
        private boolean partC;

        public Builder setPartA(String partA) {
            this.partA = partA;
            return this; // Возвращаем себя для цепочки вызовов
        }

        public Builder setPartB(int partB) {
            this.partB = partB;
            return this;
        }

        public Builder setPartC(boolean partC) {
            this.partC = partC;
            return this;
        }

        // Метод для сборки конечного объекта
        public ComplexObject build() {
            // Здесь могут быть проверки валидности
            return new ComplexObject(this);
        }
    }

    // Методы класса ComplexObject...
}

Паттерн "Прототип" (Prototype).

Он указывает виды создаваемых объектов с помощью прототипического экземпляра и создает новые объекты путем копирования этого прототипа.

// Интерфейс прототипа
interface Prototype extends Cloneable {
    Prototype clone();
}

// Конкретный прототип
class ConcretePrototype implements Prototype {
    private String property;

    public ConcretePrototype(String property) {
        this.property = property;
    }

    public String getProperty() {
        return property;
    }

    @Override
    public Prototype clone() {
        try {
            // Shallow copy
            return (Prototype) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null; // Должно быть unreachable
        }
    }
}

Паттерн "Одиночка" (Singleton).

Гарантирует, что класс имеет только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру.

class Singleton {
    // Приватное статическое поле для хранения экземпляра
    private static Singleton instance;

    // Приватный конструктор, чтобы предотвратить прямое создание экземпляров
    private Singleton() {
        // Инициализация
    }

    // Статический метод для получения единственного экземпляра
    public static Singleton getInstance() {
        if (instance == null) {
            // Ленивая инициализация (создание при первом обращении)
            // Добавьте синхронизацию для потокобезопасности в многопоточной среде
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }

    // Другие методы класса Singleton...
}