What

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

Why

Builder也是创建型模式的一种,它是一步一步的向导式的创建一个复杂的对象,Builder接口定义创建复杂对象的零部件,Director根据客户端端传入的builder按照一定的步骤创建完成复杂对象的创建。

Builder适用于比较复杂的对象的创建,该对象的创建有比较稳定的步骤或者比较稳定的“零件”,但是“零件”(步骤)内部的构建是复杂多变的。

设计模式书中Builder适用于如下情况:

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

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

How

假设如下场景,需要构造一个汽车类,汽车有轮子,方向盘,发动机,不同品牌的汽车零件算法不同。以此为示例,使用builder模式实现。

汽车builder接口

public abstract class CarBuilder {

    protected Car car=null;

    public abstract void buildWheel();

    public abstract void buildEngine();

    public abstract void buildSteeringWheel();

    public Car getResult(){
return car;
}
}

Jeep汽车builder实现

public class JeepCarBuilder extends CarBuilder {

    @Override
public void buildWheel() {
System.out.println("construct jeep car wheel");
} @Override
public void buildEngine() {
System.out.println("construct jeep car engine");
} @Override
public void buildSteeringWheel() {
System.out.println("construct jeep car steering wheel");
}
}

Chery汽车builder实现

public class CheryCarBuilder extends CarBuilder {

    @Override
public void buildWheel() {
System.out.println("construct chery car wheel");
} @Override
public void buildEngine() {
System.out.println("construct chery car engine");
} @Override
public void buildSteeringWheel() {
System.out.println("construct chery steering wheel");
}
}

Director实现

public class CarDirector {

    private CarBuilder builder;

    public CarDirector(CarBuilder builder){
this.builder=builder;
} public Car construct(){
builder.buildSteeringWheel();
builder.buildEngine();
builder.buildWheel();
return builder.getResult();
}
}

Client调用

public class App {

    public static void main( String[] args ){

        CarBuilder builder=new JeepCarBuilder();
CarDirector director=new CarDirector(builder);
director.construct(); CarBuilder builder1=new CheryCarBuilder();
CarDirector director1=new CarDirector(builder1);
director1.construct();
}
}

本示例类图如下:

Discuss

Builder模式的好处是使建造代码与表示代码分离,如果需要增加系列产品,只需要增加相应的builder接口实现即可,如果需要改变产品的表示,也只需修改builder接口的实现即可。

在jdk中,StringBuilder是一个简易版的builder模式,其中StringBuilder充当了builder以及construct的角色,Client充当了Director。

类图如下(来自happyhippy's Blog):

Reference

1、Builder模式的误区:将复杂对象的构建进行封装,就是Builder模式了吗?

设计模式学习--Builder的更多相关文章

  1. JavaScript设计模式学习——builder pattern(建造者模式)

    个人理解的应用场景 举个例子,比如想要创建各种类型的车的实例,车的类型有很多种,但创建每种类型车的接口定义可能是一样的,就用到了此模式 相关概念的通俗解释 上述例子中接口的定义叫builder 接口到 ...

  2. [学习笔记]设计模式之Builder

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 作为一个新入职的魔导士呢,哦不,是程序员,我以为并没有太多机会去设计项目的软件架构.但是,工作一段时间之后,自己渐渐意识到,哪怕是自己 ...

  3. python之路,Day24 常用设计模式学习

    python之路,Day24 常用设计模式学习   本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 ...

  4. Java设计模式学习总结

    设计模式基础学习总结 这篇总结主要是基于我之前设计模式基础系列文章而形成的的.主要是把重要的知识点用自己的话说了一遍,可能会有一些错误,还望见谅和指点.谢谢 更多详细内容可以查看我的专栏文章:设计模式 ...

  5. Java设计模式学习记录-GoF设计模式概述

    前言 最近要开始学习设计模式了,以前是偶尔会看看设计模式的书或是在网上翻到了某种设计模式,就顺便看看,也没有仔细的学习过.前段时间看完了JVM的知识,然后就想着JVM那么费劲的东西都看完了,说明自己学 ...

  6. C#大话设计模式学习总结

    如有雷同,不胜荣欣,如转载,请注明 C#大话设计模式学习总结 一.工厂模式 面向对象的三个特性:封装,继承和多态 1.封装 Class Operate { privatedouble _numberA ...

  7. Java设计模式学习笔记(三) 工厂方法模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...

  8. C#设计模式学习笔记:(2)工厂方法模式

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7567880.html,记录一下学习过程以备后续查用. 一.引言 接上一篇C#设计模式学习笔记:简单工厂模式( ...

  9. 设计模式学习系列6 原型模式(prototype)

    原型模式(prototype)用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.允许一个对象再创建另外一个新对象的时候根本无需知道任何创建细节,只需要请求圆形对象的copy函数皆可. 1 ...

随机推荐

  1. Postgres空间地理类型POINT POLYGON实现附近的定位和电子围栏功能

    目录 需求和背景 安装插件postgis 点POINT类型和距离 表添加POINT类型 添加空间索引 插入点 两个点之间的距离 附近5公里内的点 最近的10个点 面多边形'POLYGON' 添加字段类 ...

  2. 新课程网上选课系统V1.0—适用于中小学校本课程选课、选修课选课

    学校要开设选修课,人工选课实施了两年,耗时耗力,于是打算用网上选课,在网上搜索了一番,没多少实用的,有一个网上用的比较多的,功能太简单了,于是打算自己开发一个,功能参考了部分学校的功能,也有基于Aja ...

  3. sysbench做测试

    安装的时候需要libtool,如果已经装了CP到sysbench的目录下 1:用法 sysbench [general-options]… –test=<test-name> [test- ...

  4. s3cmd用法总结

    概述 S3是亚马逊AWS提供的简单存储服务(可以理解为有公网域名的大容量高可用存储) S3配合CloudFront服务可作为CDN使用,它提供多节点全球发布 安装 方法一: yum install s ...

  5. 关于tomcat不同版本的maxPostSize

    tomcat7.0.63之前: maxPostSize The maximum size in bytes of the POST which will be handled by the conta ...

  6. 茗洋Easy UI 1.3.5 部分问题解决系列专题[自定义alert关闭时间,自动关]

    [评论,楼层数为30的倍数的,我送你我自己的博客园的皮肤,该博客参与活动] 这次我又给大家带来的EasyUI的我研究拓展的新特性 我使用的是  EasyUI 1.3.5版本的,项目是ASP.NET M ...

  7. packetfence 7.2网络准入部署(一)

    packetfence 是一款内网准入软件,刚开始研究的时候也是一脸懵逼,资料少的可怜,前后玩了几个月,中途很多次都想放弃了,填完了很多坑,最后也算是成功了 好了,今天就讲一下packetfence所 ...

  8. java框架篇---hibernate(一对多)映射关系

    一对多关系可以分为单向和双向. 一对多关系单向 单向就是只能从一方找到另一方,通常是从主控类找到拥有外键的类(表).比如一个母亲可以有多个孩子,并且孩子有母亲的主键作为外键.母亲与孩子的关系就是一对多 ...

  9. 【九天教您南方cass 9.1】 09 提取坐标的几种方法

    同学们大家好,欢迎收看由老王测量上班记出品的cass9.1视频课程 我是本节课主讲老师九天. 我们讲课的教程附件也是共享的,请注意索取测量空间中. [点击索取cass教程]5元立得 (给客服说暗号:“ ...

  10. 【iCore4 双核心板_FPGA】例程七:状态机实验——状态机使用

    实验现象:按键每按下一次,三色LED改变一次状态. 核心代码: //--------------------module_rst_n---------------------------// modu ...