Sobes.tech
Middle

Aké vzory návrhu ste použili okrem Singleton?

sobes.tech AI

Odpoveď od AI

  • Factory Method. Používal som ho na vytváranie objektov bez explicitného určenia konkrétneho typu triedy. Je užitočný, keď logika vytvárania objektu závisí od podtried.
  • Abstract Factory. Používal som ho na vytváranie rodín súvisiacich alebo závislých objektov, poskytujúc rozhranie na to, ale neuvádzajúc konkrétne triedy.
  • Builder. Používal som ho na krokové vytváranie zložitých objektov, kde poradie a kombinácia krokov môžu variť. Umožňuje vyhnúť sa "teleskopickému konštruktoru".
  • Observer. Implementoval som ho na vytváranie závislostí "jeden ku mnohým" medzi objektmi, kde zmena stavu jedného objektu automaticky upozorňuje všetky závislé objekty.
  • Strategy. Používal som ho na definovanie rodiny algoritmov, ich enkapsuláciu a zabezpečenie ich vzájomnej zameniteľnosti. Umožňuje výber algoritmu počas behu.
  • Decorator. Používal som ho na dynamické pridávanie nových povinností objektom bez zmeny ich štruktúry.
  • Proxy. Používal som ho v prípadoch, keď je potrebné kontrolovať prístup k objektu, napríklad pre lenivé načítanie alebo zabezpečenie vzdialeného prístupu.
  • Template Method. Používal som ho na definovanie kostry algoritmu v nadtriede, umožňujúc podtriedam prepísať určité kroky algoritmu bez zmeny hlavnej štruktúry.
  • Adapter. Používal som ho na prevod rozhrania jednej triedy na rozhranie, očakávané klientmi. Umožňuje pracovať s triedami s nesúladnými rozhraniami.
  • Command. Používal som ho na enkapsuláciu požiadavky vo forme objektu, čo umožňuje parametrizovať klientov s rôznymi požiadavkami, umiestňovať požiadavky do fronty alebo viesť log operácií, a tiež podporovať vrátenie operácií späť.

Príklad implementácie Factory Method:

// Rozhranie produktu
interface Product {
    void doSomething();
}

// Konkrétne produkty
class ConcreteProductA implements Product {
    @Override
    public void doSomething() {
        System.out.println("Robí niečo v Product A");
    }
}

class ConcreteProductB implements Product {
    @Override
    public void doSomething() {
        System.out.println("Robí niečo v Product B");
    }
}

// Rozhranie továrne
abstract class Creator {
    public abstract Product factoryMethod();

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

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

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