一、概述

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

二、适用性

1.当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式的时候。

2.当构造过程必须允许被构造的对象有不同的表示的时候。

三、参与者

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

2.ConcreteBuilder:实现Builder接口以构造和装配该产品的各个部件。

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

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

四、类图

五、示例

Builder

  1. package cn.lynn.builder;
  2. public interface IPersonBuilder {
  3. public void buildHead();
  4. public void buildBody();
  5. public void buildFoot();
  6. public Person buildPerson();
  7. }

ConcreteBuilder

  1. package cn.lynn.builder;
  2. public class ManBuilder implements IPersonBuilder {
  3. private Person person;
  4. public ManBuilder() {
  5. person = new Man();
  6. }
  7. @Override
  8. public void buildHead() {
  9. person.setHead("建造男人的头");
  10. }
  11. @Override
  12. public void buildBody() {
  13. person.setBody("建造男人的身体");
  14. }
  15. @Override
  16. public void buildFoot() {
  17. person.setFoot("建造男人的脚");
  18. }
  19. @Override
  20. public Person buildPerson() {
  21. return person;
  22. }
  23. }

Director

  1. package cn.lynn.builder;
  2. public class PersonDirector {
  3. public Person constructPerson(IPersonBuilder builder) {
  4. builder.buildHead();
  5. builder.buildBody();
  6. builder.buildFoot();
  7. return builder.buildPerson();
  8. }
  9. }

Product

  1. package cn.lynn.builder;
  2. public class Person {
  3. private String head;
  4. private String body;
  5. private String foot;
  6. public String getHead() {
  7. return head;
  8. }
  9. public void setHead(String head) {
  10. this.head = head;
  11. }
  12. public String getBody() {
  13. return body;
  14. }
  15. public void setBody(String body) {
  16. this.body = body;
  17. }
  18. public String getFoot() {
  19. return foot;
  20. }
  21. public void setFoot(String foot) {
  22. this.foot = foot;
  23. }
  24. }
  1. package cn.lynn.builder;
  2. public class Man extends Person {
  3. }

Test

  1. package cn.lynn.builder;
  2. public class Test {
  3. public static void main(String[] args) {
  4. PersonDirector director = new PersonDirector();
  5. Person person = director.constructPerson(new ManBuilder());
  6. System.out.println(person.getHead());
  7. System.out.println(person.getBody());
  8. System.out.println(person.getFoot());
  9. }
  10. }

Result

    1. 建造男人的头
    2. 建造男人的身体
    3. 建造男人的脚

GoF23种设计模式之创建型模式之建造者模式的更多相关文章

  1. GoF23种设计模式之创建型模式之原型模式

    一.概述 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 二.适用性 1.当一个系统应该独立于它的产品创建.构成和表示的时候. 2.当要实例化的类是在运行时刻指定的时候,例如:通过动 ...

  2. GoF23种设计模式之创建型模式之工厂方法模式

    一.概述 定义一个用于创建对象的接口,让子类去决定实例化哪个类.工厂方法将一个类的实例化延迟至其子类. 二.适用性 1.当一个类不知道它所必须创建的对象的类的时候. 2.当一个类希望由其子类来指定它所 ...

  3. GoF23种设计模式之创建型模式之抽象工厂模式

    一.概述 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 二.适用性 1.一个系统要独立于它的产品的创建.组合和表示的时候. 2.一个系统要由多个产品系列中的一个来配置的时候. ...

  4. GoF23种设计模式之创建型模式之单态模式

    1概述 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2适用性 1.当类只能有一个实例而且客户可以从一个总所周知的访问点访问它的时候. 2.当这个唯一实例应该是通过子类化可扩展的,并且客户应 ...

  5. GoF的23种设计模式之创建型模式的特点和分类

    创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是“将对象的创建与使用分离”.这样可以降低系统的耦合度,使用者不需要关注对象的创建细节,对象的创建由相关的工厂来完成.就像我们去商场购买商品时, ...

  6. JAVA设计模式 4【创建型】理解建造者模式

    Hello,又是拖了几天更,实在是忙的要死,有时候忙累了,真的就是倒头睡的那种,刚好今天闲下来了.今天来更新一篇建造者模式. 其实建造者模式,我们已经在上一节已经有了解过了.只不过是上一节没有提到这样 ...

  7. GoF23种设计模式之行为型模式之迭代器模式

    一.概述    给定一种语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子.二.适用性1.当访问一个聚合对象的内容而无需暴露它的内部表示的时候.2.当对聚合对象的多 ...

  8. GoF23种设计模式之行为型模式之状态模式

    一.概述         定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 二.适用性 1.一个对象的行为取决于它的状态,并且它必须在运行时刻 ...

  9. GoF23种设计模式之行为型模式之策略模式

    传送门 ☞ 轮子的专栏 ☞ 转载请注明 ☞ http://blog.csdn.net/leverage_1229 1概述           定义一系列算法,把它们一个个都封装起来,并且让它们可以相互 ...

随机推荐

  1. pat1099. Build A Binary Search Tree (30)

    1099. Build A Binary Search Tree (30) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN ...

  2. Docker | 第三章:Docker常用命令

    前言 上一章节,简单介绍了在CentOS下的Docker的安装过程,以及运行了一个官方提供的Hello,World镜像运行了第一个Docker.就像上一章中,验证Docker是否安装成功,我们执行的是 ...

  3. Get和Post的请求

    get post请求 <form method="post","get", action="a.ashx"> <input ...

  4. java8 api简介(一)

    from https://www.aliyun.com/jiaocheng/785076.html 摘要:函数式编程详解:前言:现在有很多公司都用了jdk8,但是函数式编程也许没有用上,jdk8也提供 ...

  5. JS案例练习:图片切换+切换模式

    先附图: CSS样式部分: <style> *{;} body{font-family:'Microsoft YaHei';} .menu{margin:20px auto 0; widt ...

  6. 搭建zabbix服务器监控

    搭建zabbix 监控服务 服务器环境Centos 7.3 修改网卡名称 高并发优化 Web环境 nginx + php-fpm 必须对nginx配置有连接优化 使用systemd服务启动nginx和 ...

  7. php 实现格式化数字功能

    php 实现数字格式化功能 /** * @param $num 数字 * @param int $decimal 精度 * @param int $point_len 分隔位长度 * @return ...

  8. LeetCode Add Binary 两个二进制数相加

    class Solution { public: string addBinary(string a, string b) { if(a==""&&b==" ...

  9. codevs 4052 黎恒健大战YJY

     时间限制: 1 s  空间限制: 32000 KB  题目等级 : 黄金 Gold 题目描述 Description 现在,黎恒健与YJY由于身处异地,非常迫切地想在最短的时间内相遇,然后干一架.但 ...

  10. 详细讲解:使用tp3.2.3完成简单的注册登录功能

    使用3.2.3进行了一个简单不过的注册登录功能,界面介绍: 1.注册: 2.登录: 3.登录成功后: 没错,就是简单的让你特别容易上手,上面运用到的知识有: (1)自动验证.自动完成 (2)sessi ...