Прежде всего, давайте рассмотрим намерение для шаблона метода Factory:
Определить интерфейс для создания объекта, но пусть подклассы решают
какой класс для создания экземпляра. Фабричный метод позволяет отложить класс
создание экземпляров для подклассов.
Применимо ли это к вашей проблеме? Вы больше озабочены тем, как вы будете управлять запросами, чем созданием объектов вашего домена.
ИМХО, я бы избежал любой альтернативы реализации, которая включает статический класс / метод:
вы не можете наследовать от статического класса, поэтому вы ограничиваете расширяемость вашей модели. То же самое касается статических методов в нестатических классах: они не могут быть переопределены в подклассах.
Я бы не стал добавлять эти методы запросов к объектам вашего домена. Учитывая, что вы используете ООП для моделирования реального мира, имеет ли смысл просить Орден искать другие ордера?
Давайте подумаем об этом: в реальном мире вы используете заказ, чтобы получить из него конкретную информацию (дату, имя клиента или продукт). Когда вы хотите найти заказ, вы идете туда, где храните его, и ищите его (скажем, в картотеке). То есть вы не используете заказ для поиска других заказов.
Учитывая это, вам нужно смоделировать эту ситуацию в вашем программном обеспечении. У вас уже есть объекты, которые моделируют заказ и продукт. Вам не хватает объекта, который моделирует место, которое вы используете для хранения заказов и их поиска.
Обычно такие объекты (которые сохраняют или извлекают другие объекты) называются хранилищами. В вашем случае он может быть назван ClientOrderRepository.
Что бы сделал этот объект? Ну, вы уже упомянули об этом: выполните четыре различных запроса, которые вам нужны. Давайте посмотрим на возможное определение его интерфейса:
public interface IClientOrderRepository {
ClientOrder FindOrderWithIdMatching(int anOrderId);
ClientOrder FindOrderWithClientNameMatching(string aClientName);
ClientOrder FindOrderWithProductNameMatching(string aProductName);
ClientOrder FindOrderWithProductIdMatching(string aProductId);
}
Если вам нужен только один экземпляр класса, который будет реализовывать этот интерфейс, вы можете использовать шаблон Singleton. Не полагайтесь на варианты реализации (такие как статические методы), которые могут быть трудно изменить позже.
Наконец, даже если вы найдете конкретные шаблоны, которые решают вашу проблему, полезно подумать об объектах и способах их взаимодействия для выполнения задачи. Используйте метафоры из реальной жизни, чтобы помочь вам найти недостающие объекты или обязанности, которые необходимо выполнить. В конце концов, это все о сущности объектно-ориентированной парадигмы.
Более подробная информация о шаблоне репозитория приведена ниже.