Ios Objective-C与类聚类模式

Ios Objective-C与类聚类模式,ios,objective-c,design-patterns,Ios,Objective C,Design Patterns,我已经阅读了一些关于类集群模式的信息,并理解了下面的内容: 公共集群类只提供接口,没有实际实现,其他类根据不同情况实现 它与抽象工厂模式有一些相似之处:当我们调用方法+classNameWith…时,它可以根据参数选择最合适的子类并返回它 例如,+[NSNumber numberWithDouble:1.0]将返回存储双精度值的实现 但我不明白的是:公共集群类的方法是如何工作的 [[NSNumber alloc]initWithDouble:1.0]调用alloc后,它已经分配了NSNumb

我已经阅读了一些关于类集群模式的信息,并理解了下面的内容:

  • 公共集群类只提供接口,没有实际实现,其他类根据不同情况实现

  • 它与抽象工厂模式有一些相似之处:当我们调用方法
    +classNameWith…
    时,它可以根据参数选择最合适的子类并返回它

例如,
+[NSNumber numberWithDouble:1.0]
将返回存储双精度值的实现

但我不明白的是:公共集群类的方法是如何工作的
[[NSNumber alloc]initWithDouble:1.0]
调用
alloc
后,它已经分配了
NSNumber
的实例,而不是它的子类


那么,有人能解释一下公共集群类的
alloc init
方法的实际工作原理吗?当具体的子类实例化并返回时?

基本上,您分配的实例可能会被丢弃并替换为不同的实例。从技术上讲,这并不特定于类集群,这就是为什么在任何
init
方法中调用
super
时,需要将结果设置为
self

self = [super init];

下面是目标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
//用法
BrandingFactory*工厂=[BrandingFactory工厂:Sierra];
UIView*视图=[factory brandedView];
UIButton*按钮=[工厂品牌主按钮];
UIToolbar*工具栏=[factory brandedToolbar];
____________________________________________
//品牌工厂
//抽象工厂
#进口
typedef枚举输出类型{
极致,
齿状山脊
}输出类型;
@接口品牌工厂:NSObject
{
}
+(BrandingFactory*)工厂:(输出类型)类型;
-(UIView*)brandedView;
-(UIButton*)品牌主按钮;
-(UIToolbar*)品牌Toolbar;
@结束
___________________________________________________
//品牌工厂
//抽象工厂
#进口“BrandingFactory.h”
#导入“AcmeBrandingFactory.h”
#导入“SierraBrandingFactory.h”
@实施品牌工厂
+(BrandingFactory*)工厂:(输出类型)类型
{
如果(类型==Sierra){
返回[[[SierraBrandingFactory alloc]init]自动释放];
}
else if(type==Acme)
{
返回[[[AcmeBrandingFactory alloc]init]autorelease];
}
返回零;
}
-(UIView*)品牌视图
{
返回零;
}
-(UIButton*)品牌主按钮
{
返回零;
}
-(UIToolbar*)品牌Toolbar
{
返回零;
}
@结束
________________________________________
//锡耶拉布兰丁工厂
//抽象工厂
#进口
#进口“BrandingFactory.h”
@接口SierraBrandingFactory:BrandingFactory
{
}
-(UIView*)brandedView;
-(UIButton*)品牌主按钮;
-(UIToolbar*)品牌Toolbar;
@结束
//塞拉布兰丁工厂
//抽象工厂
#导入“SierraBrandingFactory.h”
#导入“SierraView.h”
#导入“SierraMainButton.h”
#导入“SierraToolbar.h”
@实施SierraBrandingFactory
-(UIView*)品牌视图
{
//返回Sierra的自定义视图
返回[[[SierraView alloc]init]autorelease];
}
-(UIButton*)品牌主按钮
{
//返回Sierra的自定义主按钮
返回[[[SierraMainButton alloc]init]autorelease];
}
-(UIToolbar*)品牌Toolbar
{
//返回Sierra的自定义工具栏
返回[[[Sierrac]init]autorelease];
}
@结束
________________________________________
//AcmeBrandingFactory.h
//抽象工厂
#进口
#进口“BrandingFactory.h”
@接口AcmeBrandingFactory:BrandingFactory
{
}
-(UIView*)brandedView;
-(UIButton*)品牌主按钮;
-(UIToolbar*)品牌Toolbar;
@结束
//AcmeBrandingFactory.m
//抽象工厂
#导入“AcmeBrandingFactory.h”
#导入“AcmeView.h”
#导入“AcmeMainButton.h”
#导入“AcmeToolbar.h”
@AcmeBrandingFactory的实现
-(UIView*)品牌视图
{
//返回Acme的自定义视图
返回[[[AcmeView alloc]init]autorelease];
}
-(UIButton*)品牌主按钮
{
//返回Acme的自定义主按钮
返回[[[AcmeMainButton alloc]init]autorelease];
}
-(UIToolbar*)品牌Toolbar
{
//返回Acme的自定义工具栏
返回[[[AcmeToolbar alloc]init]autorelease];
}
@结束

您可能有兴趣阅读。Josh Caswell,谢谢您的链接!我假设您已经阅读了?而且,+alloc方法可以像其他方法一样被重写。类cluster alloc可能会返回一个静态实例,而不是每次请求一个新实例时都创建和释放新对象。无聊的宇航员,是的,我还认为它们会覆盖alloc方法,因为否则会有一些销毁分配对象的开销。OP指出。这两种模式相似但不相同,这是抽象工厂实现。但总的来说,它们非常相似,你能用几句话来解释它们之间的区别吗?类簇中的工厂是一个抽象类,它产生自己的具体子类。您只需要知道您正在使用一个
NSNumber
,您不必知道在幕后您得到了一个
NSSignedIntegerNumber
的实例,但您仍然可以得到该类的特定行为。它更加隐式,因为您所做的只是调用NSNumber上的
init
方法,然后返回一个类,该类是一种NSNumber。您可以在中阅读更多有关它的信息。