2010-03-23 15 views
5

Metin görüntülemek için kullanılan birkaç Görüntüleyici bileşenim olduğunu ve kullanıcının değiştirebileceği birkaç kipi olduğunu düşünün (metin/ikili/hex görüntülemek için farklı yazı tipi önayarları). Paylaşılan nesneleri yönetmek için en iyi yaklaşım hangisi olurdu - örneğin, yazı tipleri, bul diyalog, vb. Ben tembel başlatılan nesneler ile statik sınıf Tamam olacağını düşündüm, ama bu yanlış bir fikir olabilir.Sınıflar arasında paylaşılan kaynakların yönetimi mi?

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

Tanıttığınız her türlü kaynak (yazı tipleri, iletişim kutuları vb.) Olduğunu unutmayın. Statik sınıfınız, uygulamanızın ömrü için tahsis edilecektir. İstediğin bu olabilir; sadece FYI. – TrueWill

+0

İstediğim şey bu, çünkü kaynakların yaratıldıktan sonra sonsuza kadar yaşamasını istiyorum, böylece ilk tembel yükleme sonrasında "anında" getirilebilirler. – Axarydax

+0

Bir akran incelemesinde bu kodu okursaydım gözüme batmazdım (bana iyi görünüyor!). –

cevap

1

Bir kez oluşturmak ve sonra yeniden kullanmak istediğiniz öğeler için iki ilgili desen vardır: Tekil ve Önbellek. Öğeyi sonsuza kadar tekrar kullanacaksanız, Singleton tamamdır. Bu örneğe ayrılan bellek hiçbir zaman temizlenmez. Öğeyi bir süreliğine tekrar kullanacaksanız, ancak belki bu işlev birkaç gün boyunca kullanılmayacaksa, önbelleği kullanmanızı öneriyorum. Daha sonra öğe artık kullanılmadığında hafıza temizlenebilir.

Singleton kullanıyorsanız, büyük olasılıkla Tembel init modelini kullanmak yerine doğrudan Fonts'u başlatmak istersiniz. Bana göre, Yazı Tipleri oldukça basit ve hata yapma olasılığı düşük. Ancak, öğe yapım sırasında başarısız olabilir (belki de eksik bir yazı tipi dosyası veya bir şey nedeniyle), o zaman tembel desen en azından bir dahaki sefere tekrar etmesine izin verir. Tüm uygulamayı yeniden başlatmadan, başarısız olsa bile, daha sonra statik bir başlatıcıyı yeniden yapılandıramazsınız. Bu denemeleri sınırlamaya dikkat edin!

Son olarak, "ViewerStatic" sınıfınızın adı bir sorun oluşturur. "Tanrı" nesnesi olarak bilinen bir anti-desen var. Ben buna "kova" diyorum. Eğer yaratırsan, işler gelir. Yakında kovaya dökülecek her türlü şeyi bulacaksınız. ViewerStatic sınıfınız çok büyük olacak. "FontFlyWeights" adında bir sınıfa ve daha sonra "ConstantStrings" veya "SystemDialogFactory" adında bir sınıfa sahip olmak daha iyi olurdu ...

1

Bana göre iyi görünüyor, ama gerçekten gerekli mi? Basit bir yaklaşım, sadece ihtiyaç duyduğunuzda yeni yazı tipleri ve diyaloglar oluşturmak, sonra gerekirse bunları atın ve çöp toplayıcının onları temizlemesine izin vermektir.

Basit yaklaşımın, paylaşılan nesneleri önbelleğe almanın karmaşıklığını eklemeye değecek kadar göze çarpan bir maliyete sahip olup olmadığını ölçtünüz mü?

İlgili konular