C and Class Cluster pattern
I have read some information about Class Cluster pattern, and understood next:
public cluster class only provides interface without actual implementation, other classes implement it for different cases;
it has some similarities with Abstract Factory pattern: when we call method +classNameWith...
it depending on arguments can choose the most appropriate subclass and return it.
For example, +[NSNumber numberWithDouble:1.0]
, will return implementation for storing double values.
But what i didn't understand: how works -init...
methods of public cluster class: [[NSNumber alloc] initWithDouble:1.0]
, as after calling alloc
it already allocates instance of NSNumber
, not it's subclass.
So, can somebody explain how actually works alloc-init
methods of public cluster class, and when concrete subclass instantiated and returned?
Basically, the instance you have allocated could be thrown away and replaced with a different instance. Technically, this isn't specific to class clusters and that is why when you call super
in any init
method you need to set the result as self
:
self = [super init];
这是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
链接地址: http://www.djcxy.com/p/14906.html
上一篇: WPF:多个屏幕
下一篇: C和类集群模式