文档章节

小菜学设计模式——建造者模式

learn_more
 learn_more
发布于 2015/06/11 21:16
字数 923
阅读 144
收藏 7

背景

    不要小看炒菜这件小事上,想要上一道佳肴,那是需要循规蹈矩,步步小心的。我相信你肯定在外面吃过没放盐的快餐,吃过放多了盐的快餐.....既然炒菜是一个如此复杂的过程,又必须循规蹈矩,那为什么不给他一个死规定呢?如果谁没有按照规定做事,就进行对应的提醒警告。这就是建造者模式的由来,限制规则步骤,但是开发规则细节。比如说盛菜之前必须放盐,那么规定一定要放盐,具体放多少自己论情况而定。


1、使用意图

    如果你需要将一个复杂对象的构建与它的表示(构建具体过)分离,使得同样的构建过程可以创建不同的表示的意图时,建造者模式就出现了,这个模式又称为生成器模式,从名字就可以知道,他的目的是为了构建(生成)一个对象,一个创建大体过程相同,但是具体细节不同的对象。



2、生活实例

    复杂的炒菜过程忘记了放盐



3、Java 例子(框架、JDK 、JEE)

    没有很注意,如果哪位同学觉得哪里用上了,可以补充



4、模式类图

        

1)Director:指挥者,他来定义这个复杂对象的创建流程

2)Builder:抽象构建角色,他是定义每一个规矩细节,也就是声明构建这个对象需要哪些必要的规矩方法

3)ConcreteBuilder:具体构建者,他实现了Builder的每一个规矩,因为方法实现的多样化从而造就了各种不同的对象


5、模式优点

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

    这些复杂对象的内部构建的顺序通常是稳定的,步骤的多少也是确定的,如果是那些不稳定经常发生变化的复杂对象,那么这个设计模式将会是一个未被开放封闭原则的错误!

    建造者模式的好处是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要顶一个一个具体的建造者。

    建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时适用的模式。


6、与类似模式比较

    建造者模式可以将一个产品的内部表象与产品生成过分割开来,从而可以使一个建造过程生成具有不同内部表象的产品对象。

    采用建造者模式感觉很大的优点就是:

    1)接口已经声明,没有实现的具体构建者都不能通过编译,那么步骤不会缺失(空实现也算实现)

    2)不同对象的创建容易扩展,因为建造与表示分离,所以,可以很好的扩展不同的对象。

相比其他设计模式,这个模式其实有模板方法模式有点相似,都是一个固定的过程中,实现不同的细节;





© 著作权归作者所有

共有 人打赏支持
learn_more
粉丝 91
博文 240
码字总数 210196
作品 0
深圳
程序员
迈向大牛的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。 为什么用户提出需求变更后,大牛只需潇洒地敲敲键...

一枚Sir
2015/04/10
0
0
小菜学设计模式——设计模式总结之创建型

1、面向过程与面向对象 1)面向过程通过划分功能模块,通过函数间相互调用来实现,但需求变化时就需要更改函数,而你改动的函数有多少地方在调用她呢?关联多少数据,这是很不容易弄得清楚地...

learn_more
2015/07/05
0
0
设计模式8——Builder设计模式

Builder建造者模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就...

小米米儿小
2013/12/11
0
0
JavaScript设计模式系列二之建造者模式(附案例源码)

文章初衷 设计模式其实旨在解决语言本身存在的缺陷, 目前javaScript一些新的语法特性已经集成了一些设计模式的实现, 大家在写代码的时候,没必要为了用设计模式而去用设计模式, 那么我这边为什...

小钱钱阿圣
2017/09/11
0
0
小菜学设计模式——设计模式总结之结构型

1、设计模式总结 设计模式总共23个,但是常用的不到10个,下面就把这23个设计模式进行整理归类,具体如下: 1)创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型...

learn_more
2015/07/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C++ std::function 和 std::bind

C++11提供了std::function和std::bind两个工具,用于引用可调用对象。这些可调用对象包括 普通函数,Lambda表达式,类的静态成员函数,非静态成员函数以及仿函数等。引用可调用对象,可以用于...

yepanl
30分钟前
0
0
python:可迭代对象的索引

关于 python的range的用法: 注意是[ 开始,结束)的半开区间,不包括结束 http://www.runoob.com/python/python-func-range.html import collectionsfrom collections import Iterable字符串......

Oh_really
45分钟前
2
0
docker-compose ,docker-stack

1.例子 version: "3"services: php: image: registry.cn-hangzhou.aliyuncs.com/lxepoo/apache-php5 ports: - "38080:80" networks: - my_php_mysql volum......

chenbaojun
54分钟前
3
0
SQL_Server2000示例数据库NorthWind的分析(转)

SQL_Server2000示例数据库NorthWind的分析 表名:Categories(食品类别表) 表结构: 字段名称 数据类型 长度 允许为空 CategoryID(主键) int 4 否 CategoryName nvarchar 15 否 Description ...

QQZZFT
56分钟前
1
0
laravel 5.5 Session store not set on request.

laravel 5.5 数据存入session,会出现Session store not set on request.错误。查了下laravel 5.5将session放到global middleware中,需要laravel的文件 ./app/Http/Kernel.php中的加上一句:...

MichaelShu
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部