Builder(建造者模式)

定义:The intent of the Builder design pattern is to separate the construction of a complex object from its representation. By doing so, the same construction process can create different representations

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

问题:相信每个人都写过简历吧,如果没有写过 也可以思考思考该怎么写了哦~~  现在我已经有一个很棒的生成简历模板的程序了,一个叫做Resume的抽象类,他为你提供了好多方法CreateName,CreateWork,CreateAge。。。暂时先写3个把 现在 我把这个类给你

#import <Foundation/Foundation.h>

@interface Resume : NSObject

-(void) createName;

-(void) createAge;

-(void) createWork;

@end

现在 你要去制作你自己的简历,你写一个类MyResume 继承自Resume,然后去重写这3个方法,

然后依次调用createName,createAge,createWork就能制作出和模板一样的简历了

到这里,一切似乎都很简单,因为你按照我得要求 按照顺序的调用了这3个方法,然后生成了你自己的简历

但是 你得简历不会只有这3个东西啊~~ 我刚刚和你说了 暂时写3个把。。。

如果这时候有很多很多属性,然后你漏调用了一个函数。。或者调用顺序出了问题。。。你也许就得不到和我的模板一样棒的简历了哦~~

这时候 你会怪罪我 你写的这个类太烂了。。因为你强制要求我按照一个顺序去调用你得方法,

而且那么多得函数 我怎么可能记得住呢。。。。

没错 这都是我的问题,因为我强制要求你按照顺序去调用函数了,这就是一种不合理的设计方法,

于是,我又加了一个方法叫做create,create方法会帮你按照顺序去创建简历,你只需要在MyResume中重写那3个函数即可,变成这样

#import <Foundation/Foundation.h>

@interface Resume : NSObject

-(void) createName;

-(void) createAge;

-(void) createWork;

-(void) create;

@end
#import "Resume.h"

@implementation Resume

-(void) create
{
    [self createName];
    [self createAge];
    [self createWork];
}

@end


#import <Foundation/Foundation.h>
#import "Resume.h"

@interface MyResume : Resume

@end

#import "MyResume.h"

@implementation MyResume

-(void) createName
{
    NSLog(@"create name");
}

-(void) createAge
{
    NSLog(@"create age");
}

-(void) createWork
{
    NSLog(@"create work");
}
@end


这样 问题似乎就已经被解决了,因为我也帮你完成了create的工作 在你调用的时候 你只需要 

    MyResume* myResume=[[MyResume alloc] init];
    [myResume create];

到了这里,问题似乎完美解决了,其实 我也是这样认为的,但是Builder并不是这样做的,为什么我也不明白。

上面那个解决方法有什么缺陷吗?我绞尽脑汁,想了一个不知道能不能说服自己的理由,就是 如果MyResume重写了create函数 怎么办?


于是,Builder做了一步工作 就是把create这个方法移到其他类当中

如下 Resume类去掉了create方法,变成一个抽象类

#import <Foundation/Foundation.h>

@interface Resume : NSObject

-(void) createName;

-(void) createAge;

-(void) createWork;

@end


添加一个CreateResume的类,由他来createResume

#import <Foundation/Foundation.h>
#import "Resume.h"

@interface CreateResume : NSObject

-(void) createTemplateResume:(Resume*)resume;

@end

#import "CreateResume.h"

@implementation CreateResume

-(void) createTemplateResume:(Resume *)resume
{
    [resume createName];
    [resume createAge];
    [resume createWork];
}

@end

这样 外部调用的时候只要

    MyResume* myResume=[[MyResume alloc] init];
    CreateResume* createResume=[[CreateResume alloc] init];
    [createResume createTemplateResume:myResume];


好了 到这里介绍完了整个Builer模式,回头看看定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.
一个复杂的Resume对象,把它的构建分开,由一个叫做CreateResume的类控制这个实力的产生,这样做得好处是 用户可以不用关心我得Resume是怎么创建的,按照什么顺序创建的,他只要把每一个模块写好 createName createAge createWork都完成,然后 由CreateResume这个类去帮他产生这个对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值