Builder模式,又称生成器或构建者模式,属于对象创建型模式,侧重于一步一步的构建复杂对象,只有在构建完成后才会返回生成的对象。Builder模式将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

一、使用场景

1、当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时,比如买一台电脑,我不需要知道电脑CPU,主板,机箱是如何生产的,也不需要知道它们是如何组装的。

2、当构造过程必须允许被构造的对象有不同的表示时,比如一台电脑即可以使用AMD的CPU,也可以使用Inter的CPU,这些都是可以根据需求变化的。

/**
* 构建者模式:将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示。
*
* @author qbg
*
*/
public class BuilderPattern {
/**
* 机箱抽象类
*/
abstract class Crate {
public String toString() {
return "abstract crate...";
}
} /**
* 酷冷至尊机箱
*/
class CoolerMasterCrate extends Crate {
public String toString() {
return "CoolerMaster crate...";
}
} /**
* CPU抽象类
*/
abstract class CPU {
public String toString() {
return "abstract cpu...";
}
} /**
* AMD CPU
*/
class AMDCPU extends CPU {
public String toString() {
return "AMD cpu...";
}
} /**
* 主板抽象类
*/
abstract class Motherboard {
public String toString() {
return "abstract motherboard...";
}
} /**
* 华硕主板
*/
class ASUSMotherboard extends Motherboard {
public String toString() {
return "ASUS motherboard...";
}
} /**
* 电脑定义类
*/
class Computer {
CPU cpu; // cpu
Motherboard motherboard; // 主板
Crate crate;// 机箱 public String toString() {
return "CPU:" + cpu + "\nMotherboard:" + motherboard + "\nCrate:"
+ crate;
}
} /**
* 电脑构建者接口,可以将CPU等部件通过工厂模式来生产,以进一步分离产品部件生成和构建的过程...
*/
interface ComputerBuilder {
public ComputerBuilder buildCPU(); public ComputerBuilder buildMotherboard(); public ComputerBuilder buildCrate(); public Computer getProduct();
} /**
* 最热台式电脑构建实现类
*/
class HotDeskComputerBuilder implements ComputerBuilder {
private Computer computer; public HotDeskComputerBuilder() {
this.computer = new Computer();
} public ComputerBuilder buildCPU() {
computer.cpu = new AMDCPU();
return this;
} public ComputerBuilder buildMotherboard() {
computer.motherboard = new ASUSMotherboard();
return this;
} public ComputerBuilder buildCrate() {
computer.crate = new CoolerMasterCrate();
return this;
} public Computer getProduct() {
buildMotherboard().buildCPU().buildCrate();
return computer;
}
} /**
* 导向器,客户端通过导向器获取产品, 而不关心导向器是怎样获取到Builder生成器 构建的产品对象的。而具体的构建过程则交给具体的Builder。
*/
class Director {
private ComputerBuilder builder; public Director(ComputerBuilder builder) {
this.builder = builder;
} /**
* 返回构造好的产品
*/
public Computer construct() {
return builder.getProduct();
}
} public static void main(String[] args) {
BuilderPattern bp = new BuilderPattern();
ComputerBuilder builder = bp.new HotDeskComputerBuilder();
Director director = bp.new Director(builder);
Computer computer = director.construct();
System.out.println(computer);
}
}

模式优缺点

优点:

1、可以改变一个产品的内部表示,比如示例中只要实现一个新的ComputerBuilder就能改变电脑的内部组件,因为电脑的表示和内部结构是独立于客户端代码的。

2、将构造代码和表示代码分离,构造代码相当于builder,表示代码相当于director。不同的导向器可以使用相同的生成器也构造不同的产品。

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

  1. C#创建IIS站点及相应的应用程序池,支持IIS6.0+Windows Server 2003. 使用Builder设计模式

    测试项目结构: PS:IIS6UtilsBuilder, IIS7UtilsBuilder,IISUtilsBuilder以及IISDirector为Builder设计模式实现的核心代码.Progra ...

  2. Java调用FFmpeg进行视频处理及Builder设计模式的应用

    1.FFmpeg是什么 FFmpeg(https://www.ffmpeg.org)是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它用来干吗呢?视频采集.视频格式转化.视频 ...

  3. Builder设计模式--改善构造器多个参数时可显著改善可读性

    作为一名程序开发者,设计模式其实一直有在接触,只是没有专门的去学过,所以可能对设计模式没有一个系统的理解.在一次项目中,需要使用到第三方服务商提供的功能,为了尽快的熟悉其功能代码,在官网下了demo来 ...

  4. builder设计模式(摘录ITeye文章lintomny)

    对于Builder模式很简单,但是一直想不明白为什么要这么设计,为什么要向builder要Product而不是向知道建造过程的Director要.刚才google到一篇文章,总算清楚了.在这里转贴一下 ...

  5. Builder 设计模式的学习

    Buileder(生成器)—对象创建型模式 一 意图 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 二 适用性 在以下情况使用Build模式: 1 当创建复杂对象的算法应 ...

  6. [DesignPattern]Builder设计模式

    模式的定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 模式的使用场景 相同的方法,不同的执行顺序,产生不同的事件结果时: 多个部件或零件,都可以装配到一个对象中,但是 ...

  7. 23种设计模式之Builder设计模式

    概述 建造者模式(Builder Pattern),是创造性模式之一,Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在 ...

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

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

  9. Android开发中常见的设计模式(二)——Builder模式

    了解了单例模式,接下来介绍另一个常见的模式--Builder模式. 那么什么是Builder模式呢.通过搜索,会发现大部分网上的定义都是 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建 ...

随机推荐

  1. Android开发中实现桌面小部件

    详细信息请参考原文:Android开发中实现桌面小部件 在Android开发中,有时候我们的App设计的功能比较多的时候,需要根据需要更简洁的为用户提供清晰已用的某些功能的时候,用桌面小部件就是一个很 ...

  2. node.js入门之三

    Node.js REPL(交互式解释器) Node.js REPL(Read Eval Print Loop:交互式解释器) 表示一个电脑的环境,类似 Window 系统的终端或 Unix/Linux ...

  3. 洛谷 P2341 [HAOI2006]受欢迎的牛

    题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的“喜欢”是可以传递的——如果A喜 欢B,B喜欢C,那么A也喜欢C ...

  4. 迅为4412全新升级版|3G开发板|4G开发板

    iTOP-Exynos4412开发板采用 Exynos4412的主芯片,具有更高的主频和更丰富外设,配置 2GB 双通道 DDR3的内存及 16GB 存储,支持3G/G模块.GPS模块.陀螺仪.HDM ...

  5. spring cloud 概念

    微服务构架需要使用场景: 1.可以将一个系统拆分成几个系统. 2.每个子系统可以部署多个应用,多个应用之间可以使用负载均衡. 3.需要一个服务注册中心,所有的服务都在一个注册中心注册,负载均衡也是通过 ...

  6. python根据日期返回星期

    import  time #定义:timedate为时间戳def  formattime(timedate,s="%Y-%m-%d %H:%M:%S"):      return  ...

  7. iis如何在dos中注册

    iis如何在dos中注册   2009-09-23 08:13 提问者采纳   cd \cd c:\windows\microsoft.net\framework\v2.0.50727aspnet_r ...

  8. Java 获取当前时间最近12个月(字符串)

    /** * 获取当前系统时间最近12月的年月(含当月) * 2018-04~2019-03 */ public String getLatest12Month(Date date){ Calendar ...

  9. 诊断:ORA-16188: LOG_ARCHIVE_CONFIG settings inconsistent with previously started instance

    11g数据库里面一个套RAC环境,之前搭建过DG,后来拆除掉.某次演练重启的时候,碰到数据库无法open的情况.日志显示 WARNING: The 'LOG_ARCHIVE_CONFIG' init. ...

  10. CCF计算机职业资格认证考试 201809-2 买菜

    以下内容过于幼稚,请大佬自觉绕道.. 题目描述: 时间限制:1.0s内存限制:256.0MB问题描述:问题描述 小H和小W来到了一条街上,两人分开买菜,他们买菜的过程可以描述为,去店里买一些菜然后去旁 ...