Sobes.tech
Middle

Koje obrasce dizajna, pored Singleton, ste koristili?

sobes.tech АИ

Одговор од АИ

  • Factory Method. Koristio sam ga za kreiranje objekata bez eksplicitnog navođenja konkretnog tipa klase. Koristan je kada logika kreiranja objekta zavisi od podklasa.
  • Abstract Factory. Koristio sam ga za kreiranje porodica povezanih ili zavisnih objekata, pružajući interfejs za to, ali ne navodeći konkretne klase.
  • Builder. Koristio sam ga za korak-po-korak kreiranje složenih objekata, gde redosled i kombinacija koraka mogu varirati. Omogućava izbegavanje "teleskopskog konstruktora".
  • Observer. Implementirao sam ga za kreiranje zavisnosti "jedan prema mnogima" između objekata, gde promena stanja jednog objekta automatski obaveštava sve zavisne objekte.
  • Strategy. Koristio sam ga za definisanje porodice algoritama, njihovu enkapsulaciju i obezbeđivanje njihove međusobne zamenljivosti. Omogućava izbor algoritma tokom izvršavanja.
  • Decorator. Koristio sam ga za dinamičko dodavanje novih obaveza objektima bez promene njihove strukture.
  • Proxy. Koristio sam ga u slučajevima kada je potrebno kontrolisati pristup objektu, na primer za lenjo učitavanje ili obezbeđivanje udaljenog pristupa.
  • Template Method. Koristio sam ga za definisanje kostura algoritma u superklasi, omogućavajući podklasama da prepišu određene korake algoritma bez promene osnovne strukture.
  • Adapter. Koristio sam ga za pretvaranje interfejsa jedne klase u interfejs koji očekuju klijenti. Omogućava rad sa klasama sa nespojivim interfejsima.
  • Command. Koristio sam ga za enkapsulaciju zahteva u obliku objekta, omogućavajući parametrizaciju klijenata sa različitim zahtevima, stavljanje zahteva u red ili vođenje loga operacija, kao i podršku za poništavanje operacija.

Primer implementacije Factory Method:

// Interfejs proizvoda
interface Product {
    void doSomething();
}

// Konkreti proizvodi
class ConcreteProductA implements Product {
    @Override
    public void doSomething() {
        System.out.println("Radi nešto u Product A");
    }
}

class ConcreteProductB implements Product {
    @Override
    public void doSomething() {
        System.out.println("Radi nešto u Product B");
    }
}

// Interfejs fabrike
abstract class Creator {
    public abstract Product factoryMethod();

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

// Konkrete fabrike
class ConcreteCreatorA extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

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