2010-03-23 19 views
5

Imagine que tengo varios componentes de visor que se usan para mostrar texto y tienen pocos modos que el usuario pueda cambiar (diferentes preajustes de fuente para ver texto/binario/hex). ¿Cuál sería el mejor enfoque para administrar objetos compartidos, por ejemplo fuentes, diálogo de búsqueda, etc.? Pensé que la clase estática con objetos inicializados de forma lenta estaría bien, pero esta podría ser la idea equivocada.¿Gestión de recursos compartidos entre clases?

static class ViewerStatic 
{ 
    private static Font monospaceFont; 
    public static Font MonospaceFont 
    { 
     get 
     { 
      if (monospaceFont == null) 
       //TODO read font settings from configuration 
       monospaceFont = new Font(FontFamily.GenericMonospace, 9, FontStyle.Bold); 
      return monospaceFont; 
     } 
    } 

    private static Font sansFont; 
    public static Font SansFont 
    { 
     get 
     { 
      if (sansFont == null) 
       //TODO read font settings from configuration 
       sansFont = new Font(FontFamily.GenericSansSerif, 9, FontStyle.Bold); 
      return sansFont; 
     } 
    } 
} 
+2

Tenga en cuenta que cualquier recurso IDisposable (fuentes, cuadros de diálogo, etc.) que pones su clase estática será asignada por la vida de su aplicación. Eso puede ser lo que quieres; solo para tu información. – TrueWill

+0

eso es lo que quiero, porque quiero que los recursos vivan para siempre después de que se crean, para que puedan aparecer "al instante" después de la primera carga diferida. – Axarydax

+0

No me molestaría si tuviera que leer este código en una revisión por pares (¡me queda bien!). –

Respuesta

1

Para los elementos que desea crear una vez y luego volver a utilizar, hay dos patrones relevantes: Singleton y Caché. Si va a volver a utilizar el elemento para siempre, Singleton está bien. La memoria asignada a esa instancia nunca se borrará. Si va a volver a utilizar el elemento por un tiempo, pero tal vez esa función no se utilizará durante unos días, le sugiero que use el caché. Entonces la memoria se puede borrar cuando el artículo ya no se usa.

Si está utilizando Singleton, probablemente desee iniciar las fuentes directamente en lugar de utilizar el patrón de inicio diferido. Para mí, las fuentes suenan bastante simples y no es probable que salgan errores. Sin embargo, si el elemento puede fallar durante la construcción (tal vez debido a un archivo de fuente faltante o algo así), el patrón diferido al menos le permite volver a intentarlo la próxima vez. No puede rehacer un inicializador estático más tarde, incluso si falla, sin reiniciar toda la aplicación. ¡Tenga cuidado de limitar esos reintentos!

Finalmente, el nombre de su clase "ViewerStatic" es una preocupación. Hay un antipatrón conocido como el objeto "Dios". Yo lo llamo el "cubo". Si lo creas, las cosas vendrán. Pronto encontrarás todo tipo de cosas arrojadas al cubo. Su clase ViewerStatic se convertirá en enorme. Sería mejor tener una clase llamada "FontFlyWeights" y luego otra llamada "ConstantStrings" o "SystemDialogFactory" ... etc.

1

Me parece bien, pero ¿es realmente necesario? El enfoque simple sería crear nuevas fuentes y cuadros de diálogo cuando los necesite, luego desecharlos si es necesario y dejar que el recolector de basura los limpie.

¿Ha medido para ver si el enfoque simple tiene un costo notable que hace que valga la pena agregar la complejidad del almacenamiento en caché de objetos compartidos?

Cuestiones relacionadas