Tout d'abord, nous allons examiner l'intention pour le modèle de la méthode usine:
Définir une interface pour la création d'un objet, mais nous allons décider des sous-classes classe à instancier. La méthode d'usine permet à une classe de reporter l'instanciation aux sous-classes.
Cela s'applique-t-il à votre problème? Vous êtes plus préoccupé par la façon dont vous allez gérer les requêtes que la création de vos objets de domaine.
À mon humble avis, j'éviterais n'importe quelle alternative d'implémentation qui implique une classe/méthode statique: vous ne pouvez pas hériter d'une classe statique de sorte que vous limitez l'extensibilité de votre modèle. Il en va de même pour les méthodes statiques dans les classes non statiques: elles ne peuvent pas être remplacées dans les sous-classes.
Je n'irais pas ajouter ces méthodes de requête à vos objets de domaine.En gardant à l'esprit que vous utilisez la POO pour modéliser le monde réel, est-il sensé de demander à un Ordre de chercher une autre commande?
Pensez-y: dans le monde réel, vous utilisez un ordre pour en extraire des informations spécifiques (sa date, le nom du client ou le produit impliqué). Quand vous voulez chercher une commande, vous allez partout où vous la stockez et la cherchez (disons, dans un classeur). Autrement dit, vous n'utilisez pas d'ordre pour rechercher d'autres commandes. Pour cela, vous devez modéliser cette situation dans votre logiciel. Vous avez déjà les objets qui modèlent la commande et le produit. Ce qui vous manque est un objet qui modélise l'endroit que vous utilisez pour stocker des commandes et les rechercher.
En général, ces types d'objets (qui enregistrent ou récupèrent d'autres objets) sont appelés des référentiels. Dans votre cas, il pourrait s'appeler ClientOrderRepository. Que ferait cet objet? Eh bien, vous l'avez déjà mentionné: effectuez les quatre requêtes différentes dont vous avez besoin. Voyons voir une définition possible pour son interface:
public interface IClientOrderRepository {
ClientOrder FindOrderWithIdMatching(int anOrderId);
ClientOrder FindOrderWithClientNameMatching(string aClientName);
ClientOrder FindOrderWithProductNameMatching(string aProductName);
ClientOrder FindOrderWithProductIdMatching(string aProductId);
}
Si vous devez avoir une seule instance de la classe qui mettra en œuvre cette interface, vous pouvez utiliser le modèle Singleton. Ne comptez pas sur les choix d'implémentation (comme les méthodes statiques) qui peuvent être difficiles à changer plus tard. Enfin, même si vous trouvez des motifs spécifiques qui résolvent votre problème, il est bon de réfléchir aux objets et à la façon dont ils collaborent pour accomplir une tâche. Utilisez des métaphores de la vie réelle pour vous aider à trouver des objets manquants ou des responsabilités qui doivent être remplies. En fin de compte, tout est sur l'essence du paradigme orienté objet.
Pour info plus profond sur le Pattern Repository, voici quelques ressources pour vous aider à démarrer:
Bas, je peux mettre en œuvre les méthodes statiques/classes. Je voulais que la communauté comprenne mieux le modèle à utiliser et pourquoi. Peut-être devrais-je ajouter que je suis 5 mois dans le monde de la programmation et un débutant –
+1 - Aucun «modèle» est mieux que d'essayer d'implémenter un dans cette circonstance, tout simplement ol 'OO design. Créez une classe avec les méthodes que vous voulez. Refactoriser une fois qu'il devient trop grand/compliqué. –