生成器模式也叫建造者模式,一般是用来构造复杂对象的一种模式。client(客户)-director(指导者)-builder(构造者)-product(产品)。
生成器模式能帮助构建设计部件与表现的各种组合的对象。否则知道构建对象所有细节的director可能会变成一个庞大的“神”类。但是在做应用的时候一般不会遇到如此复杂的类(请求?),只有在做游戏时,构造涉及各种特征的角色的时候,应该好好使用该模式。
例子:
一个追逐游戏,假定有两个角色,敌人和游戏者。这两个角色有一些基本trait,如力量strength、耐力stamina、智力intelligence、敏捷agility、攻击力aggressiveness。每一项特征都影响角色的防御protection和攻击power能力。
类:
(1)Character
方法:init
属性:strength,stamina,intelligence,agility,aggressiveness,protection,power
Character实际并不知道如何将自己构建成有意义的角色。所以需要CharacterBuilder来基于各个特征的关系,构建有意义的角色。
(2)CharacterBuilder 抽象基类
方法:创建Character实例,根据strength,stamina,intelligence,agility,aggressiveness构建Character实例的protection和power。
引用:Character
(3)StandardCharacterBuilder 具体类
方法:重载抽象基类,按照比例关系设定正在构建的角色的防御和攻击值。
(4)ChasingGame
方法:- (Character *)createPlayer:(CharacterBuilder *)builder; - (Character *)createEnemy:(CharacterBuilder *)builder;
(5)客户端代码
(构造者)CharacterBuilder *characterBuilder =[[StandardCharacterBuilder alloc]init];
(指导者)ChasingGame *game = [[ChasingGame alloc]init];也可以通过characterBuilder来创建game,这样下面两个方法就直接是[game createPlayer]和[game createEnemy]
(产品玩家)Character *player = [game createPlayer:characterBuilder];
(产品敌人)Character *enemy = [game createEnemy:characterBuilder];
生成器与抽象工厂模式的对比:
生成器:构建复杂对象;以多个步骤构建对象;以多种方式构建对象;在构建过程的最后一步返回产品;专注一个特定产品;
抽象工厂:构建简单或复杂对象;以单一步骤构建对象;以单一方式构建对象;立刻返回产品;强调一套产品;