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。您可以在中阅读更多有关它的信息。