Builder(建造者模式)
2014-04-27 17:41
393 查看
定义: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个把 现在 我把这个类给你
现在 你要去制作你自己的简历,你写一个类MyResume 继承自Resume,然后去重写这3个方法,
然后依次调用createName,createAge,createWork就能制作出和模板一样的简历了
到这里,一切似乎都很简单,因为你按照我得要求 按照顺序的调用了这3个方法,然后生成了你自己的简历
但是 你得简历不会只有这3个东西啊~~ 我刚刚和你说了 暂时写3个把。。。
如果这时候有很多很多属性,然后你漏调用了一个函数。。或者调用顺序出了问题。。。你也许就得不到和我的模板一样棒的简历了哦~~
这时候 你会怪罪我 你写的这个类太烂了。。因为你强制要求我按照一个顺序去调用你得方法,
而且那么多得函数 我怎么可能记得住呢。。。。
没错 这都是我的问题,因为我强制要求你按照顺序去调用函数了,这就是一种不合理的设计方法,
于是,我又加了一个方法叫做create,create方法会帮你按照顺序去创建简历,你只需要在MyResume中重写那3个函数即可,变成这样
这样 问题似乎就已经被解决了,因为我也帮你完成了create的工作 在你调用的时候 你只需要
到了这里,问题似乎完美解决了,其实 我也是这样认为的,但是Builder并不是这样做的,为什么我也不明白。
上面那个解决方法有什么缺陷吗?我绞尽脑汁,想了一个不知道能不能说服自己的理由,就是 如果MyResume重写了create函数 怎么办?
于是,Builder做了一步工作 就是把create这个方法移到其他类当中
如下 Resume类去掉了create方法,变成一个抽象类
添加一个CreateResume的类,由他来createResume
这样 外部调用的时候只要
好了 到这里介绍完了整个Builer模式,回头看看定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.
一个复杂的Resume对象,把它的构建分开,由一个叫做CreateResume的类控制这个实力的产生,这样做得好处是 用户可以不用关心我得Resume是怎么创建的,按照什么顺序创建的,他只要把每一个模块写好 createName createAge createWork都完成,然后 由CreateResume这个类去帮他产生这个对象
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.
问题:相信每个人都写过简历吧,如果没有写过 也可以思考思考该怎么写了哦~~ 现在我已经有一个很棒的生成简历模板的程序了,一个叫做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这个类去帮他产生这个对象
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 设计模式之创建型模式
- 介绍php设计模式中的工厂模式
- 面向对象设计模式的核心法则
- 常见的PHP五种设计模式小结
- 小议javascript 设计模式 推荐
- javascript 设计模式之单体模式 面向对象学习基础
- 让Flex Builder 3.0与Eclipse3.4整合起来
- 最常用的12种设计模式小结
- php设计模式 Command(命令模式)
- 超强Adobe Flex Builder v2.0.155577 注册版(Regged)
- php设计模式介绍之值对象模式第1/5页
- 设计模式之构建(Builder)模式 建造房子实例分析
- Javascript 设计模式(二) 闭包
- javascript学习笔记(九) js对象 设计模式
- Python设计模式之代理模式实例
- Python设计模式之观察者模式实例