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. android保持服务不休眠(持续运行)以及唤醒屏幕的方法

    假设有这样一个应用场景,一个服务一直在默默的工作(比如即时地获取服务器的消息),即使在屏幕已经因为长时间无操作而关闭,或者用户按了电源键让屏幕关闭,手机进入休眠状态,他必须依然在工作中.一旦从服务器获 ...

  2. AaronYang WCF教程目录

    ============================原创,讲究实践===================== 1. 那天有个小孩教我WCF[一][1/3]     基本搭建      阅读    ...

  3. 审核流(1)SNF.WorkFlow审核流简介--SNF快速开发平台3.1

    本项目是的在Spring.Net.Framework 平台之上进行研发.SNF.WorkFlow审核流是一款完全自主知识产权研发的为软件项目. 审核流基本概念:什么是审核流? 审核流:两个或两个以上的 ...

  4. Linux查看CPU和内存的配置信息

    CPU配置信息:frank@ubuntu:~/test/python$ cat /proc/cpuinfo processor : #系统中逻辑处理核的编号 vendor_id : GenuineIn ...

  5. 在android 上 使用 rxjava 入门篇

    什么是 rxJava? RxJava is a Java VM implementation of Reactive Extensions: a library for composing async ...

  6. const读书笔记

    Const 的使用读书笔记 Const的主要主要用法有: 常变量: const 类型说明符 变量名 常引用: const 类型说明符 &引用名  常对象: 类名 const 对象名 常成员函数 ...

  7. Cocos2dx网络读取图片

    // // Connection.h // XXDemo // // Created by LeeHonGee on 14-9-4. // // #ifndef __XXDemo__Connectio ...

  8. Java如何获取URL连接的日期?

    Java编程中,如何获取URL连接的日期? 以下示例演示如何使用HttpURLConnection类的httpCon.getDate()方法获取URL连接的日期. package com.yiibai ...

  9. Centos 7 查看电池电量信息

    而不像 ubuntu 在 /proc/acpi/battery/BAT 中. 其中 capacity 参数就是当前电脑的剩余电量的百分比信息了

  10. .Net MVC Cache 缓存技术总结

    一.细说 ASP.NET Cache 及其高级用法 二..Net环境下的缓存技术介绍 (转) 三.asp.net中缓存的使用介绍一 四.HttpContext.Current.Cache 过期时间