2010-03-23 30 views
5

Hãy tưởng tượng rằng tôi có một vài thành phần Viewer được sử dụng để hiển thị văn bản và chúng có vài chế độ mà người dùng có thể chuyển đổi (cài đặt phông chữ khác nhau để xem văn bản/nhị phân/hex). Cách tiếp cận tốt nhất để quản lý các đối tượng được chia sẻ - ví dụ: phông chữ, tìm hộp thoại, v.v ...? Tôi đã thấy rằng lớp tĩnh với các đối tượng được khởi tạo lười biếng sẽ là OK, nhưng đây có thể là ý tưởng sai lầm.Quản lý tài nguyên được chia sẻ giữa các lớp học?

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

Lưu ý rằng mọi tài nguyên IDisposable (phông chữ, hộp thoại, v.v.) mà bạn đưa vào lớp tĩnh của bạn sẽ được cấp phát cho tuổi thọ của ứng dụng của bạn. Đó có thể là những gì bạn muốn; chỉ là FYI. – TrueWill

+0

đó là những gì tôi muốn, bởi vì tôi muốn các nguồn lực để sống mãi mãi sau khi chúng được tạo ra, vì vậy chúng có thể được đưa lên "ngay lập tức" sau khi tải đầu tiên lười biếng. – Axarydax

+0

Tôi sẽ không dè mắt nếu tôi đọc mã này trong một bài đánh giá ngang hàng (có vẻ tốt với tôi!). –

Trả lời

1

Đối với các mục bạn muốn tạo một lần và sau đó sử dụng lại, có hai mẫu liên quan: Singleton và Cache. Nếu bạn sẽ tái sử dụng mục này mãi mãi, Singleton là OK. Bộ nhớ được cấp phát cho cá thể đó sẽ không bao giờ bị xóa. Nếu bạn sẽ sử dụng lại mục này một lúc, nhưng sau đó có thể chức năng đó sẽ không được sử dụng trong một vài ngày, tôi khuyên bạn nên sử dụng bộ nhớ cache. Sau đó, bộ nhớ có thể bị xóa khi mục không còn được sử dụng nữa.

Nếu bạn đang sử dụng Singleton, bạn có thể muốn chỉ cần khởi chạy phông chữ trực tiếp thay vì sử dụng mẫu init lười biếng. Đối với tôi, Fonts nghe khá đơn giản và không có khả năng gây lỗi. Tuy nhiên, nếu mục đó có thể không thành công trong quá trình xây dựng (có thể do tệp phông bị thiếu hoặc thứ gì đó), thì mẫu lười biếng ít nhất sẽ cho phép nó thử lại lần sau. Bạn không thể làm lại bộ khởi tạo tĩnh sau này, ngay cả khi nó không thành công, mà không cần khởi động lại toàn bộ ứng dụng. Hãy cẩn thận để hạn chế những lần thử lại đó!

Cuối cùng, tên của lớp học "ViewerStatic" làm tăng mối quan tâm. Có một mô hình chống được gọi là đối tượng "Thiên Chúa". Tôi gọi nó là "xô". Nếu bạn tạo ra nó, mọi thứ sẽ đến. Bạn sẽ sớm tìm thấy tất cả các loại công cụ được đổ trong xô. Lớp ViewerStatic của bạn sẽ trở nên rất lớn. Sẽ tốt hơn nếu có một lớp được gọi là "FontFlyWeights" và sau đó một lớp khác được gọi là "ConstantStrings" hoặc "SystemDialogFactory" ... v.v.

1

Điều đó có vẻ ổn với tôi, nhưng thực sự có cần thiết không? Cách tiếp cận đơn giản là chỉ cần tạo phông chữ và hộp thoại mới khi bạn cần chúng, sau đó Vứt bỏ chúng nếu cần và để cho bộ thu gom rác dọn sạch chúng.

Bạn đã đo để xem liệu cách tiếp cận đơn giản có một chi phí đáng chú ý khiến nó đáng giá thêm độ phức tạp của bộ nhớ đệm đối tượng được chia sẻ không?

Các vấn đề liên quan