2017-07-05 44 views
1

我在目标C中创建了一个框架,它具有多个功能,其中需要初始化所有功能,同时安装库实例,我在哪里也提供了灵活性,以提供替代实现任何功能,以实现这一点,我正在使用生成器模式如下,我的问题是,哪种更好的设计模式适合在这里?或者我如何才能提高服务表现/内存使用情况,请建议我一些模式对于这个问题我在目标C中创建一个框架,它需要一个好的构造函数模式

-(instancetype)initWithBuilder:(LibraryBuilder *)builder { 
    self = [super init]; 
    if (self) { 
     // allocate feature1 instance 
     if (builder.feature1) 
      self.feature1 = builder.feature1; 
     else 
      self.feature1 = [[InterfaceA alloc] initWithLib:self]; 

     // allocate feature2 instance 
     if (builder.feature2) 
      self.feature2 = builder.feature2; 
     else 
      self.feature2 = [[InterfaceB alloc] init]; 

     // allocate App Configuration instance 
     if (builder.feature3) 
      self.feature3 = builder.feature3; 
     else 
      self.feature3 = [[InterfaceC alloc] init]; 

     // allocate feature4 instance 
     if (builder.feature4) 
      self.feature4 = builder.feature4; 
     else 
      self.feature4 = [[InterfaceD alloc] init]; 

     // allocate feature5 instance 
     if (builder.feature5) 
      self.feature5 = builder.feature5; 
     else 
      self.feature5 = [[InterfaceE alloc] init]; 

     // allocate feature6 instance 
     if (builder.feature6) 
      self.feature6 = builder.feature6; 
     else 
      self.feature6 = [[InterfaceF alloc] init]; 

     // allocate feature7 instance 
     if (builder.feature7) 
      self.feature7 = builder.feature7; 
     else 
      self.feature7 = [[InterfaceG alloc] init]; 

     // allocate feature8 instance 
     if (builder.feature8) 
      self.feature8 = builder.feature8; 
     else 
      self.feature8 = [[InterfaceH alloc] init]; 

return self; 
} 
+0

也许有些懒惰的var可以在这里使用。 – Larme

+0

如果我正确理解你,你想从建设者那里获得一个功能,如果有的话。否则,你想创建并设置一个“默认”特征实例。我能帮你解决吗? –

+0

@ AminNegm-Awad,谢谢你的回复,是的,你是对的 –

回答

1

假设我理解正确的,你(不回答任何假设吗?),它似乎在Objective-更容易C。

首先哟不需要单独的类LibraryBuilder。只需使用字典。

其次,您可以利用KVC和Objective-C的动态绑定。

A.创建一个查找所有功能,我。即在一个类的方法(或+initialize或其他)

+(NSDictionary*)defaultFeatureClasses 
{ 
    return 
    @{ 
    @"featureName1" : [FeatureClass1 class], 
    @"featureName2" : [FeatureClass2 class], 
    // … 
    @"featureNameN" : [FeatureClassN class], 
    }; 
}); 

如果类名记者的功能名称,一个可以简化,但这个看起来并不像一个大问题。

接下来,编写一个初始化,这需要的特征字典:

- (instancetype)initWithFeatureSet:(NSDictionary*)features 
{ 
    self = [super init]; 
    if (self) 
    { 
    [defaultClasses enumerateKeysAndObjectsUsingBlock: 
    ^(NSString *key, Class featureClass, BOOL *stop) 
    { 
     id feature = features[key]; 
     if (feature==nil) 
     { 
     feature = [featureClass new]; 
     } 
     [self setValue:feature forKey:key]; 
    } 

    } 
    return self; 
} 

然后你就可以很容易地建立一个图书馆

… [[Library alloc] initWithFeatures: 
@{ 
    @"Feature1" : myFeaatureA, 
    @"Feature2" : anotherCustomFeature, 
}]; 

为拓展功能,你只需要改变单一的在一个单一的方法。

+0

Thanx为精彩的交代,Doest这个模型提高了表演?我可以看到它减少了行数,但执行时间相同,如果我错了,请纠正我的错误 –

+0

您是否遇到性能问题?制作建筑良好的代码。如果性能出现问题,请改进。阿伯记得唐纳德克努特。 I. e .:如果默认功能实例是无状态的,则可以有一个实例堆以供重用。 (通常对象创建是昂贵的。)您可以为功能编写懒惰的getter(不安全的时间,但传播CPU消耗),... –

相关问题