Uno degli obiettivi potrebbe essere quello di astrarre il modo in cui si accede ai dati di rete.
Tale astrazione può essere molto astratta:
public loadProducts(currentCategory) returns list of Product {
var productsFactory = dataAccess.factory.createProductsFactory();
var productsOfCategory = productsFactory.loadProducts(currentCategory);
return productsOfCategory;
}
Qui il chiamante non sa se i prodotti vengono caricati da un database, un file XML, una richiesta REST o qualcosa di completamente diverso. Rende molto facile la sostituzione di un'origine dati con un'altra, ad esempio la migrazione di tutti i dati da un servizio REST a un database.
O l'astrazione può essere più trasparente:
public doPostRequest(parameters) returns Stream {
... // Use library A to do the request. if you need to switch to library B later, this
// is not an issue.
}
Qui, il chiamante sa che la libreria sta usando una risorsa di rete. Pur essendo trasparente, tale libreria può ancora essere utile durante la migrazione da un modo per fare richieste HTTP a un altro.
In .NET Framework, ad esempio, ci sono almeno tre modi per fare richieste HTTP, senza contare tutte le librerie di terze parti che si possono usare. Scegliere una direzione e attenersi ad essa è una soluzione, ma in seguito la migrazione a un'altra implementazione sarebbe dolorosa. Un'altra soluzione è quella di creare il proprio livello, astrarre l'effettiva implementazione: se verrà rilasciata una nuova versione di .NET Framework e si desidera utilizzare un nuovo modo di eseguire le richieste HTTP, si modificherà il codice in un unico punto.