Supponiamo di avere una classe Widget che fa parte di un framework utilizzato in modo indipendente da molte applicazioni. Creo istanze di widget in molte situazioni e le loro vite variano. Oltre ai metodi specificati per l'istanza di Widget, mi piacerebbe essere in grado di eseguire le seguenti operazioni di classe:
- Trova una singola istanza Widget basata su un ID univoco
- Fai scorrere l'elenco di tutti i widget
- Rimuovi un widget dall'insieme di tutti i widget
Per supportare queste operazioni, ho preso in considerazione due approcci:
-
Classe contenitore : crea una classe container o manager, WidgetContainer, che contiene un elenco di tutte le istanze Widget, supporta l'iterazione e fornisce metodi per l'aggiunta, la rimozione e la ricerca di widget. Ad esempio in C #:
public class WidgetContainer : IEnumerable<Widget> { public void AddWidget(Widget); public Widget GetWidget(WidgetId id); public void RemoveWidget(WidgetId id); }
-
Metodi di classe statica : aggiungi metodi di classi statiche a Widget. Ad esempio:
public class Widget { public Widget(WidgetId id); public static Widget GetWidget(WidgetId id); public static void RemoveWidget(WidgetId id); public static IEnumerable<Widget> AllWidgets(); }
L'uso di una classe contenitore ha il problema aggiunto di come accedere alla classe contenitore. Rendilo un singleton? .. yuck! Crea un oggetto World che fornisce l'accesso a tutte queste classi contenitore?
Ho visto molti framework che usano l'approccio della classe contenitore, quindi qual è il consenso generale?