Tôi cần một lớp đơn để được khởi tạo với một số đối số. Con đường tôi đang làm nó bây giờ là:Singleton với tham số
class SingletonExample
{
private SingletonExample mInstance;
//other members...
private SingletonExample()
{
}
public SingletonExample Instance
{
get
{
if (mInstance == null)
{
throw new Exception("Object not created");
}
return mInstance;
}
}
public void Create(string arg1, string arg2)
{
mInstance = new SingletonExample();
mInstance.Arg1 = arg1;
mInstance.ObjectCaller = new ObjectCaller(arg2);
//etc... basically, create object...
}
}
Các ví dụ được tạo ra 'muộn', có nghĩa là tôi không có tất cả các đối số cần thiết khi khởi động ứng dụng.
Nói chung tôi không thích bắt buộc đặt hàng các cuộc gọi phương thức, nhưng tôi không thấy cách khác ở đây. IoC cũng sẽ không giải quyết nó, vì tôi có thể đăng ký nó trong thùng chứa, tôi cũng có thể gọi Create() ...
Bạn có coi đây là kịch bản OK không? Bạn có ý tưởng nào khác không?
chỉnh sửa: Tôi biết rằng những gì tôi viết là một ví dụ nó không đề an toàn, thread-safe không phải là một phần của câu hỏi
đó là * không * một singleton. đâu là loại trừ lẫn nhau? (tức là 'khóa'). cộng với 'getter' của bạn cho cá thể nên tạo cá thể, không phải là ctor - đó là toàn bộ điểm. – RPM1984
Tôi đồng ý với RPM1984, đây không phải là singleton. Các đối số của bạn có thể thay đổi hay chúng sẽ giống nhau trong suốt thời gian tồn tại của ứng dụng của bạn? Một singleton không nên phụ thuộc vào một biến nào đó, nó có thể phụ thuộc vào cấu hình hoặc một singleton khác. Tuy nhiên, thực sự nghĩ rằng thông qua thiết kế của bạn và tự hỏi mình nếu nó là một singleton bạn cần. Hơn sử dụng đơn là thực sự xấu cho thiết kế của bạn. –
Đó là singleton alright, tôi tin rằng :) getter' không thể tạo ra các ví dụ vì nó không có đối số - nó có thể có, nhưng nó chỉ thuận tiện hơn để viết nó như thế này. Và, các đối số, một khi thu được không thay đổi. – veljkoz