一、概述

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

二、适用性

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. 在Pycharm中写python代码时光标变粗

    在练习写python代码时,不小心摁了Insert键,结果光标变粗. 如下图所示: 原因: 和word一样,在编辑文本或代码时,有两种模式:改写和插入模式. 当我们在编辑文章或者是代码时,应该将模式设 ...

  2. java里如何实现循环打印出字符或字符数组里的内容

    不多说,直接上干货! java里如何实现循环打印出字符里的内容 没写,暂时不会 java里如何实现循环打印出字符数组里的内容 public class test { public static voi ...

  3. Hadoop实战:reduce端实现Join

    项目描述 现在假设有两个数据集:气象站数据库和天气记录数据库,并考虑如何合二为一.一个典型的查询是:输出气象站的历史信息,同时各行记录也包含气象站的元数据信息. 气象站和天气记录合并之后的示意图如下所 ...

  4. Jenkins~通过WebDeploy实现自动部署

    Jenkins以之前的文章中已经有所介绍,主要集成了自动化部署的功能,而对于自动化部署来说是由多个组件组成的,每个组件负责自己的事,如今天说的webDeploy,它主要实现将网站文件动态发布到另一台I ...

  5. Device

    #import "AppDelegate.h" #import "RootViewController.h" @implementation AppDelega ...

  6. bootstrap Table的 一些小操作

    function HQCreatTable(ob) { var option = { cache: false,//是否使用缓存,默认为true,所以一般情况下需要设置一下这个属性(*) scroll ...

  7. 属性,选择器和css

    一.属性 属性:表示事物的一些特征 属性分为标签属性和样式属性 标签属性:<img src="1.jpg" width="200px" heifht=&q ...

  8. window.open()方法详解

    , 最基本的弹出窗口代码   window.open('page.html'); 2, 经过设置后的弹出窗口   window.open('page.html', 'newwindow', 'heig ...

  9. 几幅手稿讲解CNN

    学习深度神经网络方面的算法已经有一段时间了,对目前比较经典的模型也有了一些了解.这种曾经一度低迷的方法现在已经吸引了很多领域的目光,在几年前仅仅存在于研究者想象中的应用,近几年也相继被深度学习方法实现 ...

  10. django ORM 简单示例简绍

    简单 models 操作 class Host(models.Model): nid = models.AutoField(primary_key=True) #Nid为主键 hostname = m ...