Ridisegnare un builder per renderlo riutilizzabile

1

Diciamo che ho una classe builder (che tra l'altro non è tecnicamente un costruttore, ma neanche una fabbrica) per generare regole diverse per un gioco:

public class RuleBuilder {
    private Game game;

    public RuleBuilder(Game g) {
        game = g;
    }

    public Rule scoreRule() {
        return new ScoreRule(game);
    }

    public Rule playerRule() {
        return new PlayerRule(game);
    }

    // etc...
}

Il builder restituisce istanze di sottoclassi della classe Rule .

Se volessimo che una terza parte definisse le proprie regole e le aggiungesse al gioco, cosa dovrei cambiare nel design per adattarsi a questa nuova esigenza?

    
posta dabadaba 22.04.2016 - 00:14
fonte

1 risposta

1

Quello che descrivi qui è un Factory , che semplicemente scarica la responsabilità della creazione dell'oggetto in un'altra classe. Quale fabbrica usare è statica: nota al momento della compilazione, non cambia.

Ciò di cui hai bisogno è una Fabbrica astratta , dove la fabbrica è un'interfaccia e l'implementazione della fabbrica è sconosciuta fino tempo di esecuzione. Ciò consente a terzi di ignorare la logica di creazione secondo necessità.

Il modo ideale per configurarlo è attraverso un framework come Spring , in cui una terza parte può facilmente configurare i propri bean factory. Sarebbe simile a questo:

<beans>
  <bean name="RuleBuilder" class="com.dabadaba.RuleBuilder "/>
</beans>

Quindi una terza parte può sovrascriverla in questo modo:

<beans>
  <bean name="RuleBuilder" class="com.someoneelse.RuleBuilder "/>
</beans>

Il codice sarebbe simile a questo:

public class RuleBuilder {
  public Rule playerRule() {
    return new SomeOtherPlayerRule(game);
  }
}

Nota che i bean dovrebbero avere costruttori predefiniti, ma puoi collegare l'istanza del gioco anche attraverso la configurazione (questo va oltre lo scopo della tua domanda: consulta la documentazione di Spring se decidi di seguire quella rotta).

In effetti con un po 'più di fatica non hai nemmeno bisogno della fabbrica astratta, perché Spring può creare gli oggetti creati dalla fabbrica usando un labirinto di XML e annotazioni. All'inizio può essere scoraggiante, ma una volta configurato è piuttosto facile da usare ed estendere.

    
risposta data 22.04.2016 - 00:38
fonte

Leggi altre domande sui tag