2017-10-10 1 views
0

Mon cadre va créer des objets qui ont une interface A.Comment puis-je laisser mon cadre créer des instances de sous-classes définies par l'utilisateur

L'utilisateur est responsable de la définition des sous-classes concrètes B, C, D ...

Qu'est-ce que est la bonne façon pour moi de dire le cadre ici sont mes classes concrètes que vous pouvez créer vous-même (autant que vous le souhaitez). Mes pensées initiales étaient quelque chose comme le modèle de conception de commande. La différence est que ce serait une classe générique (B, C, D ...) et retournerait A. Serait-ce approprié? Une autre approche serait de faire quelque chose de similaire avec une méthode d'usine.

Existe-t-il un autre modèle pour résoudre ce problème?

L'utilisateur devrait être capable de créer autant de sous-classes alternatives qu'il le souhaite sans modifier le framework. Le cadre ne devrait connaître que l'interface A.

Répondre

1

Vous dites que le framework va create instances de classes dont il ne sait rien?

Le moyen standard pour ce faire serait d'utiliser une usine ou un fournisseur.

interface A { ... } 

class B implements A { ... } 
class C implements A { ... } 

Supplier<B> factoryB =() => { 
    return new B(); 
}; 
Supplier<C> factoryC =() => { 
    return new C(); 
}; 

Ensuite, le cadre peut utiliser des instances de Supplier<? extends A>

Supplier<? extends A> factory = ...; 
A a = factory.get(); 

Une mise en œuvre concrète de ce modèle est ServiceLoader, qui permet à des tiers de fournir des implémentations d'une interface à l'exécution. Il y a un Oracle tutorial on ServiceLoader

0

La nature de votre déclaration de problème est de traiter le mécanisme de création d'objet. Vous voulez que framework crée l'instance des classes définies par l'utilisateur. Donc, cette déclaration de problème relève du modèle de création. Vous pouvez concevoir votre application en utilisant Factory Pattern. Plus tard vous pouvez passer à Abstract Factory Pattern en cas de classes plus compliquées ou de familles de classes augmentées.