Sobes.tech
Middle

Кои шаблони за дизайн, освен Singleton, сте използвали?

sobes.tech AI

Отговор от AI

  • Factory Method. Използвах го за създаване на обекти без явното указване на конкретен тип клас. Полезен е, когато логиката за създаване на обекта зависи от подкласове.
  • Abstract Factory. Използвах го за създаване на семейства свързани или зависими обекти, предоставяйки интерфейс за това, но без да посочвам конкретни класове.
  • Builder. Използвах го за стъпково създаване на сложни обекти, където редът и комбинацията от стъпки могат да варират. Позволява да се избегне "телескопичен конструктор".
  • Observer. Реализирах го за създаване на зависимости "един към много" между обекти, където промяната в състоянието на един обект автоматично уведомява всички зависими обекти.
  • Strategy. Използвах го за дефиниране на семейство алгоритми, инкапсулиране на всеки от тях и осигуряване на тяхната взаимозаменяемост. Позволява избор на алгоритъм по време на изпълнение.
  • Decorator. Използвах го за динамично добавяне на нови отговорности към обекти без да променям тяхната структура.
  • Proxy. Използвах го в случаи, когато е необходимо да се контролира достъп до обект, например за лениво зареждане или осигуряване на отдалечен достъп.
  • Template Method. Използвах го за определяне на скелета на алгоритъм в суперклас, позволявайки на подкласовете да пренаписват определени стъпки без да променят основната структура.
  • Adapter. Използвах го за преобразуване на интерфейса на един клас в интерфейса, очакван от клиентите. Позволява работа с класове с несъвместими интерфейси.
  • Command. Използвах го за инкапсулиране на заявка като обект, позволявайки параметризиране на клиенти с различни заявки, поставяне на заявки в опашка или водене на лог на операции, както и поддържане на отмяна на операции.

Пример за реализация на Factory Method:

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

// Конкретни продукти
class ConcreteProductA implements Product {
    @Override
    public void doSomething() {
        System.out.println("Прави нещо в Product A");
    }
}

class ConcreteProductB implements Product {
    @Override
    public void doSomething() {
        System.out.println("Прави нещо в Product B");
    }
}

// Интерфейс на фабриката
abstract class Creator {
    public abstract Product factoryMethod();

    public void someOperation() {
        Product product = factoryMethod();
        product.doSomething();
    }
}

// Конкретни фабрики
class ConcreteCreatorA extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

class ConcreteCreatorB extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductB();
    }
}