天天看點

生成器模式——設計模式系列

        生成器模式有兩個核心概念,一個是Director(指導者)、一個是Builder(生成器)。Builder知道如何在缺少某些特定資訊的情況下建造産品,Director知道Builder應該建造什麼,以參數向其提供缺少的資訊來建造特定産品。生成器關注分步建立複雜對象,在最後一步傳回産品。以下以代碼進行說明。

//最終産品

@interface Character : NSObject 

{

 @private

 float protection_;

 float power_;

 float strength_;

 float stamina_;

 float intelligence_;

 float agility_;

 float aggressiveness_;

}

@end

=================================================================

//父類Builder

@interface CharacterBuilder : NSObject 

{

 @protected

 Character *character_;

}

@property (nonatomic,readonly) Character *character;

- (CharacterBuilder *) buildNewCharacter;

- (CharacterBuilder *) buildStrength:(float) value;

- (CharacterBuilder *) buildStamina:(float) value;

- (CharacterBuilder *) buildIntelligence:(float) value;

- (CharacterBuilder *) buildAgility:(float) value;

- (CharacterBuilder *) buildAggressiveness:(float) value;

@end

=================================================================

//實作類Builder

@interface StandardCharacterBuilder : CharacterBuilder 

{

}

// overriden methods from the abstract CharacterBuilder

- (CharacterBuilder *) buildStrength:(float) value;

- (CharacterBuilder *) buildStamina:(float) value;

- (CharacterBuilder *) buildIntelligence:(float) value;

- (CharacterBuilder *) buildAgility:(float) value;

- (CharacterBuilder *) buildAggressiveness:(float) value;

@end

=================================================================

//Director

@interface ChasingGame : NSObject 

{

}

- (Character *) createPlayer:(CharacterBuilder *) builder;

- (Character *) createEnemy:(CharacterBuilder *) builder;

@end

=================================================================

//用戶端調用代碼

- (void)viewDidLoad 

{

  [superviewDidLoad];

 CharacterBuilder *characterBuilder = [[[StandardCharacterBuilderalloc] init] autorelease];

 ChasingGame *game = [[[ChasingGamealloc] init] autorelease];

  Character *player = [game createPlayer:characterBuilder];

  Character *enemy = [game createEnemy:characterBuilder];

 // do something else with the

 // player and enemey

}

繼續閱讀