Il vero problema è che la distribuzione di un'applicazione è incapsulata da una classe specifica per ogni applicazione, che richiede modifiche al codice dell'applicazione e del database.
Per prima cosa è necessario rompere ogni distribuzione in una serie di passaggi (Erik Eidt ha accennato a questo, ma non è andato abbastanza lontano). Quindi identifica un'astrazione chiara per ogni passaggio.
Ad esempio, è necessario spostare i file da una posizione di gestione temporanea a un server. Definisci un passaggio (e una classe) che esegue questo passaggio, dati l'origine e la destinazione, oltre alle credenziali di accesso se necessario.
Altre fasi possono essere astratte in termini generali, come eseguire script di shell o effettuare chiamate ai servizi API.
Nessuna singola applicazione dovrebbe essere la sua classe. Potrebbe essere una classe chiamata "ApplicationDeployment" che ha una serie di passaggi. Le informazioni specifiche per ogni passaggio devono essere conservate in una o più tabelle in un database o in un archivio di file flat.
Lo schema di fabbrica è ancora applicabile a questo problema se lo si utilizza per generare istanze concrete di una sorta di "passaggio" in un processo di distribuzione dell'applicazione.
Il problema si trova con ogni applicazione che richiede una classe personalizzata e modifiche al database.