Sobes.tech
Middle

Jaké návrhové vzory jste použili kromě Singletonu?

sobes.tech AI

Odpověď od AI

  • Factory Method. Používal jsem ho k vytváření objektů bez explicitního určení konkrétního typu třídy. Je užitečný, když logika tvorby objektu závisí na podtřídách.
  • Abstract Factory. Používal jsem ho k vytváření rodin souvisejících nebo závislých objektů, poskytujíc rozhraní pro to, ale neuvádějíc konkrétní třídy.
  • Builder. Používal jsem ho k krokovému vytváření složitých objektů, kde se může lišit pořadí a kombinace kroků. Umožňuje se vyhnout "teleskopickému konstruktoru".
  • Observer. Implementoval jsem ho pro vytváření závislostí "jeden ku mnoha" mezi objekty, kde změna stavu jednoho objektu automaticky upozorňuje všechny závislé objekty.
  • Strategy. Používal jsem ho k definování rodiny algoritmů, jejich enkapsulaci a zajištění jejich vzájemné zaměnitelnosti. Umožňuje vybírat algoritmus za běhu.
  • Decorator. Používal jsem ho k dynamickému přidávání nových povinností objektům bez změny jejich struktury.
  • Proxy. Používal jsem ho v případech, kdy je třeba kontrolovat přístup k objektu, například pro lenivé načítání nebo zajištění vzdáleného přístupu.
  • Template Method. Používal jsem ho k definování kostry algoritmu v nadtřídě, umožňující podtřídám přepsat určité kroky algoritmu bez změny hlavní struktury.
  • Adapter. Používal jsem ho k převodu rozhraní jedné třídy na rozhraní očekávané klienty. Umožňuje pracovat s třídami s neslučitelnými rozhraními.
  • Command. Používal jsem ho k enkapsulaci požadavku ve formě objektu, což umožňuje parametrizovat klienty s různými požadavky, umisťovat požadavky do fronty nebo vést log operací, a také podporovat vrácení operací zpět.

Příklad implementace Factory Method:

// Rozhraní produktu
interface Product {
    void doSomething();
}

// Konkrétní produkty
class ConcreteProductA implements Product {
    @Override
    public void doSomething() {
        System.out.println("Dělá něco v Product A");
    }
}

class ConcreteProductB implements Product {
    @Override
    public void doSomething() {
        System.out.println("Dělá něco v Product B");
    }
}

// Rozhraní továrny
abstract class Creator {
    public abstract Product factoryMethod();

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

// Konkrétní továrny
class ConcreteCreatorA extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

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