2012-11-02 29 views
35

Trong khi gần đây làm việc với Objective-C và các thư viện khác nhau được viết trong đó, tôi đã nhận thấy hai mẫu singleton thực sự phổ biến. Một phiên bản tìm nạp cá thể singleton và gọi các phương thức cá thể của nó và phiên bản khác chỉ trưng ra các phương thức lớp và không bao giờ cung cấp cho bạn một cá thể để làm việc. Tất cả đều có mục đích tóm tắt quyền truy cập vào một tài nguyên duy nhất (StoreKit, CoreData, Parse API, v.v.). Ví dụ, đây là cách tiếp cận cũ được sử dụng trong MKStoreKit:Singleton Instance vs Class Methods

// initialize singleton during app boot 
[MKStoreManager sharedManager] 

// sometime later in the app 
[[MKStoreManager sharedManager] buyFeature:kFeatureAId 
           onComplete:^(NSString* purchasedFeature) 
{ 
    NSLog(@"Purchased: %@", purchasedFeature); 
} 
           onCancelled:^ 
{ 
    NSLog(@"User Cancelled Transaction"); 
}]; 

hoặc cách khác NSUserDefaults, UIApplication vv .. Cách tiếp cận khác có thể được nhìn thấy trong MagicalRecord hoặc ở đây với Parse API:

// configure API credentials sometime during app boot 
[Parse setApplicationId:@"123456" 
       clientKey:@"123456"]; 

// sometime later 
PFObject *testObject = [PFObject objectWithClassName:@"TestObject"]; 
[testObject setObject:@"bar" forKey:@"foo"]; 
[testObject save]; 

là gì số ưu và khuyết điểm của hai cách tiếp cận và là một trong số chúng về cơ bản tốt hơn so với phương pháp khác?

Không phải truy xuất thể hiện được chia sẻ tiết kiệm một số thuộc tính màn hình (sự khác biệt hiệu suất có thể không thích hợp), nhưng tôi có vặn bản thân theo một cách khác, ví dụ, kiểm thử khôn ngoan không?

Cảm ơn!

Trả lời

27

Có hai cách khác nhau để thực hiện phương pháp này dựa trên phương pháp lớp:

  • Thực hiện một ví dụ singleton sử dụng một lớp ẩn từ tất cả mọi người, và giấu các phương pháp của nó đằng sau phương pháp lớp wrapper có chữ ký giống hệt nhau, hoặc
  • Make phương pháp lớp học mà làm tất cả công việc

Ý nghĩa của việc thực hiện đầu tiên là tất cả mọi thứ bạn có thể làm với một singleton, bạn có thể làm với các singleton ẩn:

0.123.
  • sử dụng một lớp con sẽ trở thành một khả năng
  • chuyển đổi các trường hợp ở giữa chạy rất dễ dàng
  • cuộc sống nhà nước trong các biến dụ
  • khởi sau mô hình quen thuộc

Nếu bạn đi cho một thực hiện mà không sử dụng một singleton, bạn sẽ dựa vào các biến tĩnh để giữ trạng thái hiện tại của bạn. Đó là một lựa chọn hợp pháp, nhưng mô hình khởi tạo trở nên khác biệt (thậm chí có thể sử dụng một số dispatch_once), bạn không thể chuyển đổi việc triển khai ở giữa mà không dựa vào một số điều kiện xấu xí và sử dụng phân lớp trở nên phức tạp hơn nhiều.

Kiểm tra triển khai đầu tiên có phần dễ dàng hơn thử nghiệm lần thứ hai, bởi vì bạn có thể cung cấp triển khai riêng lẻ singleton để thử nghiệm, có lẽ thông qua cửa sau; với việc triển khai dựa trên tĩnh, không thể thực hiện tuyến đường này.

Để tóm tắt, tôi sẽ sử dụng giải pháp dựa trên singleton, với singleton tùy chọn ẩn đằng sau "mặt tiền" cung cấp quyền truy cập vào các phương thức của singleton. Tôi sẽ không sử dụng một thực hiện mà tất cả các tiểu bang phải được đặt trong các biến tĩnh.

+1

Câu trả lời hay, cảm ơn! –

+0

Câu trả lời hay nhưng một ví dụ nhỏ sẽ làm cho nó dễ hiểu hơn nhiều. – atulkhatri

7

Một lợi thế của phương pháp singleton là nó trở nên tầm thường để cho phép các trường hợp khác nếu bạn cần. Nếu bạn sử dụng phương pháp lớp học, đó là tất cả những gì bạn nhận được mà không cần phải tái cấu trúc lại nhiều.

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