Я бы остерегался сингла. Его часто злоупотребляют в местах, где это не всегда нужно. Вы должны использовать только синглтон, если за один раз должен быть только один экземпляр этого класса. В этом примере вы использовали бы синглтон, только если вы хотите одновременно выполнять только одно действие Ship ().
Один шаблон, который мне нравится использовать, - это создание частного поля только для чтения для сервисов в классе, который может выглядеть следующим образом:
public ShippingController
{
private readonly ProductService productService;
public ShippingController(ProductService service)
{
productService = service;
}
void ShipProduct(Product aProduct)
{
service.Ship(aProduct);
}
}
По крайней мере, таким образом, вы не связаны каким-либо решением, вы можете создать глобальный ProductService, который будет использоваться во всем приложении, или вы можете создать новый экземпляр и передать его таким образом, чтобы у вас было лучшее обоих миров.
То, какой путь лучше, зависит от вашей ситуации. Тщательно продумайте, какие именно требования предъявляются к использованию вашего сервиса, и выполните его соответствующим образом.