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.