Sobes.tech
Back to questions
Junior
86
questionbank

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

Sobes Copilot

Get answers in real time

Answer from AI

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...
}