Tôi đã gặp sự cố hôm nay và một người bạn đề nghị tôi sử dụng một trường hợp tĩnh toàn cầu hoặc mẫu đơn giản hơn thanh lịch. Tôi đã dành một vài giờ đọc về những người độc thân nhưng một vài điều vẫn còn thoát khỏi tôi.Sử dụng singleton thay vì một thể hiện tĩnh toàn cầu
Bối cảnh: Việc cố gắng thực hiện là tạo một thể hiện của một API và sử dụng cá thể này trong tất cả các lớp của tôi (trái ngược với việc tạo kết nối mới, v.v.).
Dường như có khoảng 100 cách tạo Singleton nhưng với một số trợ giúp từ yoda Tôi đã tìm thấy một số ví dụ về an toàn chủ đề. ..so được cung cấp mã sau:
public sealed class Singleton
{
public static Singleton Instance { get; private set; }
private Singleton()
{
APIClass api = new APIClass(); //Can this be done?
}
static Singleton() { Instance = new Singleton(); }
}
Làm thế nào/Bạn sẽ khởi tạo lớp mới này ở đâu và cách gọi từ lớp riêng?
EDIT: Tôi nhận ra lớp Singleton có thể được gọi với một cái gì đó giống như
Singleton obj1 = Singleton.Instance();
nhưng tôi sẽ có thể truy cập các phương pháp trong lớp API (tức obj1.Start.)? (không phải tôi cần, chỉ cần hỏi)
EDIT # 2: Tôi có thể đã hơi sớm trong việc kiểm tra câu trả lời nhưng tôi có một điều nhỏ mà vẫn gây ra vấn đề cho tôi. API đang khởi chạy tốt, đáng tiếc là Im có thể khởi chạy hai phiên bản?
Mã New
public sealed class SingletonAPI
{
public static SingletonAPI Instance { get; private set; }
private SingletonAPI() {}
static SingletonAPI() { Instance = new SingletonAPI(); }
// API method:
public void Start() { API myAPI = new API();}
}
nhưng nếu tôi cố gắng làm một cái gì đó như thế này ...
SingletonAPI api = SingletonAPI.Instance;
api.Start();
SingletonAPI api2 = SingletonAPI.Instance; // This was just for testing.
api2.Start();
tôi nhận được một thông báo lỗi rằng tôi không thể bắt đầu nhiều hơn một ví dụ.
Bạn nên hãy thêm một hàm tạo riêng, để ngăn chặn một lớp khác khởi tạo một bản sao Singleton của bạn. –
Cảm ơn bạn, tôi đã bỏ lỡ điều đó. – Ryan
Bạn sẽ không thể gọi các phương thức trên lớp api vì nó không bị lộ. –