定义: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
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
#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];
一个复杂的Resume对象,把它的构建分开,由一个叫做CreateResume的类控制这个实力的产生,这样做得好处是 用户可以不用关心我得Resume是怎么创建的,按照什么顺序创建的,他只要把每一个模块写好 createName createAge createWork都完成,然后 由CreateResume这个类去帮他产生这个对象