Có một vài vấn đề với Singletons. Tôi sẽ phác thảo chúng bên dưới, và sau đó đề xuất một số giải pháp thay thế. Tôi không phải là một "Không bao giờ sử dụng một singleton, hoặc bạn là một coder crap" loại người như tôi tin rằng họ có sử dụng của họ. Nhưng việc sử dụng đó rất hiếm.
An toàn chủ đề. Nếu bạn có một Singleton toàn cầu tĩnh, thì nó phải là chủ đề an toàn bởi vì bất cứ thứ gì có thể truy cập nó bất cứ lúc nào. Đây là phí bổ sung.
Kiểm tra đơn vị khó hơn với Singletons.
Đó là một thay thế giá rẻ cho các biến toàn cầu (ý tôi là, đó là những gì một singleton là vào cuối ngày, mặc dù nó có thể có phương pháp và những thứ ưa thích khác).
Xem, nó không phải là Singleton là "gớm ghiếc khủng" cho mỗi gia nhập, nhưng rằng đó là mẫu thiết kế đầu tiên nhiều người lập trình mới có được để đối phó với và nó tiện hoang mang của nó cạm bẫy (Chỉ cần dính vào một số bánh răng trên nó và gọi nó là hơi nước-punk).
Trong trường hợp của bạn, bạn đang đề cập đến Mô hình và đây luôn là "các trường hợp" khi chúng phản ánh một cách tự nhiên dữ liệu. Có lẽ bạn đang lo lắng về chi phí của việc có được những trường hợp này. Tin tôi đi, họ sẽ không đáng kể (xuống thiết kế truy cập dữ liệu, rõ ràng).
Vì vậy, lựa chọn thay thế? Chuyển mô hình đến những nơi yêu cầu. Điều này làm cho việc kiểm tra đơn vị dễ dàng hơn và cho phép bạn trao đổi các nguyên tắc cơ bản của mô hình đó trong nhịp tim. Điều này cũng có nghĩa là bạn có thể muốn xem giao diện - đây là một giao ước. Sau đó, bạn có thể tạo các đối tượng cụ thể để triển khai các giao diện này và thì đấy - mã của bạn có thể dễ dàng kiểm tra đơn vị và có thể sửa đổi được.
Trong thế giới đơn lẻ, một thay đổi duy nhất đối với singleton đó về cơ bản có thể phá vỡ mọi thứ trong cơ sở mã. Không phải là một điều tốt.
Nguồn
2013-06-04 19:03:57
Đặt "MODELS" tĩnh ?? Không thật sự lắm. Một chút cũng không. Thậm chí còn tồi tệ hơn [phân tích HTML với RegEx] (http://stackoverflow.com/a/1732454/643085) –
Heh. Không thể cưỡng lại được. – sircodesalot
Nếu sử dụng DI, thay vì làm cho nó tĩnh, hãy đăng ký nó trong vùng chứa với ContainerControlledLifetimeManager. Với tĩnh, bạn có nhiều vấn đề với an toàn luồng. –