美文网首页
建造者模式(Builder)(生成器)

建造者模式(Builder)(生成器)

作者: 傻傻小萝卜 | 来源:发表于2017-04-17 17:24 被阅读28次

    基本概念

    建造者模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    建造者主要是用来创建一些复杂的对象,这些对象内部构造间的建造顺序通常是稳定,但是对象内部的构造通常是面临着复杂的变化。

    1 Builder:为创建一个产品对象的各个部件指定抽象接口。

    2 ConcreteBuilder:实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口。

    3 Director:构造一个使用Builder接口的对象。

    4 Product:表示被构造的复杂对象。ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。

    Product,一种产品,它具有多个复杂的部件

    @interface Product : NSObject

    @property (nonatomic, strong)NSMutableArray *partArray;// 部件数组

    - (void)addPart:(NSString *)partString;// 添加部件

    - (void)show;// 展示所有部件

    @end

    #import "Product.h"

    @implementation Product

    - (instancetype)init

    {

    self = [super init];

    if (self) {

    self.partArray = [NSMutableArray array];

    }

    return self;

    }

    - (void)addPart:(NSString *)partString

    {

    [self.partArray addObject:partString];

    }

    - (void)show

    {

    NSLog(@"产品创建----");

    for (NSString *part in self.partArray) {

    NSLog(@"%@",part);

    }

    }

    @end

    Builder:抽象的建造类,他将产品Product 分为两个建造过程PartA和PartB,并得到最终的产品getResult

    @interface Builder : NSObject

    @property (nonatomic, strong)Product *product;

    - (void)buildPartA;

    - (void)buildPartB;

    - (Product *)getResult;

    @end

    建造类1:产品的第一种建造工艺

    @implementation ConcreteBuilder1

    - (instancetype)init

    {

    self = [super init];

    if (self) {

    self.product = [[Product alloc] init];

    }

    return self;

    }

    - (void)buildPartA

    {

    [self.product addPart:@"Part A"];

    }

    - (void)buildPartB

    {

    [self.product addPart:@"Part B"];

    }

    - (Product *)getResult

    {

    return self.product;

    }

    @end

    建造类2:产品的第二种建造工艺

    #import "ConcreteBuilder2.h"

    @implementation ConcreteBuilder2

    - (instancetype)init

    {

    self = [super init];

    if (self) {

    self.product = [[Product alloc] init];

    }

    return self;

    }

    - (void)buildPartA

    {

    [self.product addPart:@"部件 1"];

    }

    - (void)buildPartB

    {

    [self.product addPart:@"部件 2"];

    }

    - (Product *)getResult

    {

    return self.product;

    }

    @end

    Director类:指挥类,要求产品是第一种建造工艺还是第二种建造工艺

    @interface Director : NSObject

    - (void)constructWithBuilder:(Builder *)builder;

    @end

    #import "Director.h"

    @implementation Director

    - (instancetype)init

    {

    self = [super init];

    if (self) {

    }

    return self;

    }

    - (void)constructWithBuilder:(Builder *)builder

    {

    [builder buildPartA];

    [builder buildPartB];

    }

    @end

    客户端实现:

    (1)第一种工艺

    Director *director = [[Director alloc]init];// 创建指挥者

    Builder *b1 = [[ConcreteBuilder1 alloc] init];

    [director constructWithBuilder:b1];

    Product *p1 = [b1 getResult];

    [p1 show];

    输出结果

    2017-04-17 17:08:01.488 简单工厂——01[41833:300289] 产品创建----

    2017-04-17 17:08:01.488 简单工厂——01[41833:300289] Part A

    2017-04-17 17:08:01.488 简单工厂——01[41833:300289] Part B

    (2)第二种工艺

    Director *director = [[Director alloc]init];// 创建指挥者

    Builder *b2 = [[ConcreteBuilder2 alloc] init];

    [director constructWithBuilder:b2];

    Product *p2 = [b2 getResult];

    [p2 show];

    输出结果

    2017-04-17 17:22:28.405 简单工厂——01[42029:310980] 产品创建----

    2017-04-17 17:22:28.405 简单工厂——01[42029:310980] 部件 1

    2017-04-17 17:22:28.405 简单工厂——01[42029:310980] 部件 2

    相关文章

      网友评论

          本文标题:建造者模式(Builder)(生成器)

          本文链接:https://www.haomeiwen.com/subject/ycrwattx.html