2013-07-27 27 views
7

Tôi đã đọc một số thông tin về mô hình lớp Cluster, và hiểu tiếp theo:Objective-C và loại Cụm mẫu

  • public class cụm chỉ cung cấp giao diện mà không cần thực hiện thực tế, các lớp học khác thực hiện nó cho các trường hợp khác nhau;

  • nó có một số điểm tương đồng với kiểu Abstract Factory: khi chúng ta gọi phương thức +classNameWith... tùy thuộc vào đối số có thể chọn lớp con phù hợp nhất và trả về nó.

Ví dụ: +[NSNumber numberWithDouble:1.0], sẽ trả lại triển khai để lưu trữ giá trị kép.

Nhưng những gì tôi không hiểu: làm thế nào các công trình -init... phương pháp của lớp cụm công cộng: [[NSNumber alloc] initWithDouble:1.0], như sau khi gọi alloc nó đã phân bổ thể hiện của NSNumber, không đó là lớp con.

Vì vậy, ai đó có thể giải thích cách thực sự hoạt động alloc-init phương pháp của lớp cụm công khai và khi phân lớp bê tông được khởi tạo và trả về?

+2

Bạn có thể quan tâm đến việc perusing [phiên bản GNUStep của NSNumber.m] (https://github.com/gnustep/gnustep-base/blob/master/Source/NSNumber.m). –

+0

Josh Caswell, cảm ơn vì liên kết tuyệt vời! – Mikhail

+0

Tôi cho rằng bạn đã đọc [Các khái niệm trong Lập trình Mục tiêu-C: Nhóm Lớp] (https://developer.apple.com/library/ios/documentation/general/conceptual/CocoaEncyclopedia/ClassClusters/ClassClusters.html)? –

Trả lời

5

Về cơ bản, trường hợp bạn đã cấp phát có thể bị vứt bỏ và được thay bằng một phiên bản khác. Về mặt kỹ thuật, đây là không cụ thể cho cụm lớp và đó là lý do tại sao khi bạn gọi super trong bất kỳ phương pháp init bạn cần phải thiết lập kết quả như self:

self = [super init]; 
+1

Hơn nữa, phương pháp + phân bổ có thể được ghi đè giống như bất kỳ phương pháp nào khác. Phân bổ cụm lớp có lẽ sẽ trả về một cá thể tĩnh, thay vì các đối tượng mới được tạo và phát hành mỗi khi bạn yêu cầu một cá thể mới. –

+0

Bored Astronaut, vâng tôi cũng nghĩ rằng họ ghi đè lên phương pháp phân bổ, bởi vì nếu không sẽ có một số chi phí cho việc phá hủy các đối tượng được phân bổ. – Mikhail

-2

Đây là việc thực hiện nhà máy Tóm tắt cho Objective C.

// Usage 
    BrandingFactory * factory = [BrandingFactory factory:Sierra]; 

    UIView * view = [factory brandedView]; 

    UIButton * button = [factory brandedMainButton]; 

    UIToolbar * toolbar = [factory brandedToolbar]; 
____________________________________________ 
// BrandingFactory.h 
// AbstractFactory 

#import <Foundation/Foundation.h> 

typedef enum ouputTypes { 
    Acme, 
    Sierra 
} OutputTypes; 

@interface BrandingFactory : NSObject 
{ 

} 

+ (BrandingFactory *) factory: (OutputTypes)type; 

- (UIView *) brandedView; 
- (UIButton *) brandedMainButton; 
- (UIToolbar *) brandedToolbar; 

@end 

___________________________________________________ 

// BrandingFactory.m 
// AbstractFactory 

#import "BrandingFactory.h" 
#import "AcmeBrandingFactory.h" 
#import "SierraBrandingFactory.h" 


@implementation BrandingFactory 

+ (BrandingFactory *) factory:(OutputTypes)type 
{ 
    if (type == Sierra) { 
     return [[[SierraBrandingFactory alloc] init] autorelease]; 
    } 
    else if (type == Acme) 
    { 
     return [[[AcmeBrandingFactory alloc] init] autorelease]; 
    } 
    return nil; 

} 

- (UIView *) brandedView 
{ 
    return nil; 
} 

- (UIButton *) brandedMainButton 
{ 
    return nil; 
} 

- (UIToolbar *) brandedToolbar 
{ 
    return nil; 
} 

@end 

________________________________________ 

// SierraBrandingFactory.h 
// AbstractFactory 

#import <Foundation/Foundation.h> 
#import "BrandingFactory.h" 


@interface SierraBrandingFactory : BrandingFactory 
{ 

} 

- (UIView*) brandedView; 
- (UIButton*) brandedMainButton; 
- (UIToolbar*) brandedToolbar; 

@end 


// SierraBrandingFactory.m 
// AbstractFactory 

#import "SierraBrandingFactory.h" 
#import "SierraView.h" 
#import "SierraMainButton.h" 
#import "SierraToolbar.h" 

@implementation SierraBrandingFactory 

- (UIView*) brandedView 
{ 
    // returns a custom view for Sierra 
    return [[[SierraView alloc] init] autorelease]; 
} 

- (UIButton*) brandedMainButton 
{ 
    // returns a custom main button for Sierra 
    return [[[SierraMainButton alloc] init] autorelease]; 
} 

- (UIToolbar*) brandedToolbar 
{ 
    // returns a custom toolbar for Sierra 
    return [[[SierraToolbar alloc] init] autorelease]; 
} 

@end 

________________________________________ 
// AcmeBrandingFactory.h 
// AbstractFactory 


#import <Foundation/Foundation.h> 
#import "BrandingFactory.h" 


@interface AcmeBrandingFactory : BrandingFactory 
{ 

} 

- (UIView *) brandedView; 
- (UIButton *) brandedMainButton; 
- (UIToolbar *) brandedToolbar; 

@end 


// AcmeBrandingFactory.m 
// AbstractFactory 

#import "AcmeBrandingFactory.h" 
#import "AcmeView.h" 
#import "AcmeMainButton.h" 
#import "AcmeToolbar.h" 


@implementation AcmeBrandingFactory 

- (UIView *) brandedView 
{ 
    // returns a custom view for Acme 
    return [[[AcmeView alloc] init] autorelease]; 
} 

- (UIButton *) brandedMainButton 
{ 
    // returns a custom main button for Acme 
    return [[[AcmeMainButton alloc] init] autorelease]; 
} 

- (UIToolbar *) brandedToolbar 
{ 
    // returns a custom toolbar for Acme 
    return [[[AcmeToolbar alloc] init] autorelease]; 
} 

@end 
+0

Như OP chỉ ra. Hai mẫu là * tương tự * nhưng không giống nhau –

+0

Vì vậy, đây là bản tóm tắt của Nhà máy. Nhưng nói chung chúng rất giống nhau http://stackoverflow.com/a/2459385/1847511 –

+0

Bạn có thể giải thích sự khác biệt trong vài từ không? –

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