设计模式之BUILDER(生成器)模式

bancheng发布

1、意图
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
2、应用场景
1) 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。

2) 当构造过程必须允许被构造的对象有不同的表示时。

3) Builder模式要解决的也正是这样的问题:

当我们要创建的对象很复杂的时候(通常是由很多其他的对象组合而成),我们要复杂对象的创建过程和这个对象的表示(展示)分离开来,这样做的好处就是通过一步步的进行复杂对象的构建,由于在每一步的构造过程中可以引入参数,使得经过相同的步骤创建最后得到的对象的展示不一样。
3、结构模式:
3CA015121FC208E3C39F397AE820A754.jpg
4、时序图
FD9D099120FCBED2F81C9B673D083289.jpg
心得:
标准的Builder模式有三个角色。
1)指导者(Director)使用Construct方法构造产品BuilderProduct,但是它不直接参与构造过程,而是把构造的任务交给生成器(Builder)。
2)Builder提供了产品每一个部件构造的实现方法(可以是默认实现),但是如果要获得最终的产品,需要派生Builder的子类,添加getResult方法返回最终的产品对象。BuildPart方法正是被指导者调用指挥产品生产流程的接口。
3)BuilderProduct 是最终生成交付给客户的产品

BUILDER 模式在实际的使用过程中,有将Director 和 Builder 角色合二为一的情况

4、示例
小明在沙漠中开了一个快餐店,店里面只有一个服务员和两个厨师,只销售两种套餐(套餐一:(五元套餐). 套餐二:(十元套餐))。

//builder接口
@class Food;
@protocol FoodBuilder <NSObject>
- (void)cookieFood;
- (Food *)getFood;
@end
//十元套餐的厨师
- (void)cookieFood
{
    if (!self.food)
    {
        self.food = [[Food alloc] initWitName:@"十元套餐"
                                        price:5.0f];
    }
}
- (Food *)getFood
{
    [self cookieFood];
    return  self.food;
}

//五元套餐的厨师
- (void)cookieFood
{
    if (!self.food)
    {
     self.food = [[Food alloc] initWitName:@"五元套餐" price:5.0f];
    }
}
- (Food *)getFood
{
    [self cookieFood];
    return  self.food;
}

//服务员类
@property(nonatomic,strong)id<FoodBuilder> foodBuilder;
- (Food *)getFood;

- (Food *)getFood
{
    [self.foodBuilder cookieFood];
    Food * food = [self.foodBuilder getFood];
    [food description];
    return food;
}

这天店里面来了两位客人,一个点了分五元套餐, 一个点了分 十元套餐

        FiveFootBuilder * fiveFood = [[FiveFootBuilder alloc]init];
        TenFoodBuilder * tenFood = [[TenFoodBuilder alloc] init];

        Seller * seller = [[Seller alloc] init];
        seller.foodBuilder = fiveFood;
        [seller getFood];

        seller.foodBuilder = tenFood;
        [seller getFood];


bancheng

iOS开发者一枚,现就职中国北京。在这里记录自己开发遇到的问题和学习记录的笔记。喜欢学习、摄影。

发表评论

电子邮件地址不会被公开。 必填项已用*标注