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

类图:

  适用性:

  • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
  • 当构造过程必须允许被构造的对象有不同的表示时。

  效果:

  • 它使你可以改变一个产品的内部表示。你可以通过定义一个新的ConcreteBuilder来产生不同的产品。
  • 它将构造代码和表示代码分开。
  • 它使你可对构造过程进行更精细的控制。Builder接口能很好地反映产品的构造过程。

  通过建造者模式,用户只需指定需要建造的类型就可以得到它们,而具体的建造过程和细节就不需要知道了。实际上建造者模式就是将创建的流程放到抽象类(或接口)中,将流程中的具体实现放到子类中实现

  例子:比如炒饭,炒饭的流程就是,但是有的客人要求咸一点,有的客人要求蛋多一点,这就导致具体的炒饭会有所不同。因此我们将加饭的量,鸡蛋的量,配料的量,和翻炒时间都放到子类(或实现接口的类)中去实现,而将流程放到抽象类/接口中,通过厨师(Director)来将饭炒好给客人品尝。

  

  以下以上面的炒饭为例子:

public class 建造者模式 {
    public static void main(String[] args) {
        ChaofanDirector cd = new ChaofanDirector();
        Chaofan chaofan = cd.constructChaofan(new MoreEggChaofanBuilder());
        chaofan.print();
        chaofan = cd.constructChaofan(new SaltyChaofanBuilder());
        chaofan.print();
    }
}

enum Size { LITTLE, NORMAL, MUCH };

//Product
class Chaofan {
    public Size rice; //这里节省空间就不写getters/setters
    public Size egg;
    public Size spices;
    public Size stirfly;
    public void print() {
        System.out.println(rice + " Rice, " + egg + " Egg, " + spices + " Spices, " + stirfly + " Stirfly");
    }
}

//Builder
interface ChaofanBuilder {
    void addRice();
    void addEgg();
    void addSpices();
    void stirFly();
    Chaofan buildChaofan();
}

//ConcreteBuilder
class SaltyChaofanBuilder implements ChaofanBuilder {
    Chaofan chaofan;
    public SaltyChaofanBuilder() {
        chaofan = new Chaofan();
    }
    public void addRice() {
        chaofan.rice = Size.NORMAL;
    }
    public void addEgg() {
        chaofan.egg = Size.NORMAL;
    }
    public void addSpices() {
        chaofan.spices = Size.MUCH;
    }
    public void stirFly() {
        chaofan.stirfly = Size.NORMAL;
    }
    public Chaofan buildChaofan() {
        return chaofan;
    }
}

class MoreEggChaofanBuilder implements ChaofanBuilder {
    Chaofan chaofan;
    public MoreEggChaofanBuilder() {
        chaofan = new Chaofan();
    }
    public void addRice() {
        chaofan.rice = Size.NORMAL;
    }
    public void addEgg() {
        chaofan.egg = Size.MUCH;
    }
    public void addSpices() {
        chaofan.spices = Size.NORMAL;
    }
    public void stirFly() {
        chaofan.stirfly = Size.NORMAL;
    }
    public Chaofan buildChaofan() {
        return chaofan;
    }
}

//Director
class ChaofanDirector {
    public Chaofan constructChaofan(ChaofanBuilder cb) {
        cb.addRice();
        cb.addEgg();
        cb.addSpices();
        cb.stirFly();
        return cb.buildChaofan();
    }
}

  分析:我们要的炒饭就是Chaofan类,即类图中的Product,炒饭的流程都是一样的,该流程放在了Builder即ChaofanBuilder类中,而客人要求的炒饭是不同的,具体的炒饭实现方式放在了ConcreteBuilder即MoreEggChaofanBuilder和SaltyChaofanBuilder中,而Director即ChaofanDirector就是厨师,负责把饭炒好,然后给客人品尝。

  

  总结:将流程放到接口中,具体细节放到子类中,通过Director创建出Product。

建造者模式(Builder)的更多相关文章

  1. 【原】iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解释建造者模式的概念,那些东西太虚了.设计模式这种东西是为了解决实际问题的,不能为了设计模式而设计模式, ...

  2. 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)

    原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...

  3. 建造者模式(Builder)-宏观的使用角度

    建造者模式(Builder) 建造者模式是用来解决产品对象的创建过程是由多个零件组成的情况,这些零件与产品本身是组合关系,也就是部分与整体,这些零件的创建顺序,还有一些创建中的逻辑,都是稳定的,可以封 ...

  4. 【设计模式】建造者模式 Builder Pattern

    前面学习了简单工厂模式,工厂方法模式以及抽象工厂模式,这些都是创建类的对象所使用的一些常用的方法和套路, 那么如果我们创建一个很复杂的对象可上面的三种方法都不太适合,那么“专业的事交给专业人去做”,2 ...

  5. 建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) 它可以将多个简单的对象一步一步构建成一个复杂的对象. 意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. 主要解决:主要解决在软 ...

  6. 二十四种设计模式:建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) 介绍将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 示例用同样的构建过程创建Sql和Xml的Insert()方法和Get()方 ...

  7. iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...

  8. 建造者模式(Builder)——从组装电脑开始

    建造者模式(Builder)--从组装电脑开始 建造者模式概括起来就是将不同独立的组件按照一定的条件组合起来构成一个相对业务完整的对象.调用者无需知道构造的过程. 我们从组装电脑开始 让我们从买组装电 ...

  9. 设计模式—建造者模式(Builder)

    title: 设计模式-建造者模式 建造者模式(Builder)是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节.建造者模式属于对 ...

  10. 设计模式系列之建造者模式(Builder Pattern)——复杂对象的组装与创建

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

随机推荐

  1. Nginx [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use)

    使用命令关闭占用80端口的程序 sudo fuser -k 80/tcp

  2. Android性能优化之布局优化

    最新最准确内容建议直接访问原文:Android性能优化之布局优化 本文为Android性能优化的第二篇——布局优化,主要介绍使用抽象布局标签(include, viewstub, merge).去除不 ...

  3. RecyclerView 介绍 02 – 重要概念

    几个概念 RecyclerView是一个ViewGroup: LayoutManager控制RecyclerView的ChildView的布局显示,childview由Recycler提供以及管理: ...

  4. 把所有css放到一个css文件的格式

    @charset "utf-8"; @import url("global.css"); @import url("common.css") ...

  5. CSS3设置多张背景图片

    background-image:url("1.jpg"),url("2.jpg"),url("3.jpg");background-rep ...

  6. MFC 设置控件事件对应的函数

    在项目中,右击你想设置的控件,打开属性. 然后找到:控件事件,如果在Visual Studio 2015中操作,显示如图: 然后,以设定单击事件为例: 点击右边的三角,选择 <Edit Code ...

  7. Bridge模式——对象结构型模式

    今天看了Bridge模式,对其进行简单的总结,并给出几篇通俗易懂的文章链接. (一)意图--将抽象部分和它的实现部分分离,使它们都可以独立地变化. 适用于从多维度描述的类型,拆解开来,使其能沿着各维度 ...

  8. 使用递推解题:EOJ2999

    题目: Description 给定一个多项式 (ax+by)k,计算多项式展开后 xnym 项的系数. Input 第1行:一个整数T(1≤T≤10)为问题数. 接下来共T行.每行5个整数,分别为a ...

  9. BZOJ4607 : [PA2015 Final]Edycja

    显然做完操作$2$后再做操作$1$. 建立一个$26$个点的有向图,每个点只有一条出边,$i$->$j$表示$i$最终变成了$j$,边权为一开始是$i$,最后不是$j$的位置个数,如果$i\ne ...

  10. Storm配置项详解【转】

    Storm配置项详解 ——阿里数据平台技术博客:storm配置项详解 什么是Storm? Storm是twitter开源的一套实时数据处理框架,基于该框架你可以通过简单的编程来实现对数据流的实时处理变 ...