定义

建造者模式是对象的创建型模式,可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象

建造者模式将产品的结构和产品的零件建造过程对客户端隐藏起来,把对建造过程进行指挥的责任和具体建造者零件的责任分割开来,达到责任划分和封装的目的

意图

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

主要解决问题

主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定

何时使用

一些基本部件不会变,而其组合经常变化的时候

优缺点

优点:

  • 建造者独立,易扩展
  • 便于控制细节风险

缺点:

  • 产品必须有共同点,范围有限制
  • 如果内部变化复杂,会有很多的建造类

结构



涉及的角色:

  • 抽象建造者(Builder)角色:给出一个抽象接口,用来规范产品对象的各个组成成分的建造,一般来说,产品所包含的零件数目和建造方法的数目相等,换而言之,有多少个零件,就有多少相应的建造方法
  • 具体建造者(ConcreteBuilder)角色:实现抽象建造者所声明的接口,给出一步步的完成创建产品实例的操作;在建造过程完成后,提供产品的实例
  • 导演者(Director)角色:担任这个角色的类调用具体建造者角色来创建产品对象,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色
  • 产品(Product)角色:产品便是建造中的复杂对象,一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关的

一般来说,每有一个产品类,就有一个相应的具体建造者类,这些产品应当有一样数目的零件,而每有一个零件,就相应的在所有的建造者角色中有一个建造方法

源码如下:

public interface Builder {

    /** 产品零件构造方法 */
void buildPart1(); /** 产品零件构造方法 */
void buildPart2(); /** 产品返还方法 */
Product retrieveResult();
}
public class ConcreteBuilder implements Builder {

    private Product product = new Product();

    /** 产品零件构造方法 */
@Override
public void buildPart1() {
//建造产品的第一个零件
} /** 产品零件构造方法 */
@Override
public void buildPart2() {
//建造产品的第二个零件
} /** 产品返还方法 */
@Override
public Product retrieveResult() {
return product;
}
}
public class Director {
private Builder builder; /**
* 产品构造方法,负责调用各个零件构造方法
*/
public void construct() {
builder = new ConcreteBuilder();
builder.buildPart1();
builder.buildPart2();
builder.retrieveResult();
}
}
public class Product {
}

组装电脑的例子

电脑的组装有内存、主板、cpu、机箱等,可以按照不同的步骤进行组装

电脑类:

public class Compute {

    /** cpu */
private String cpu; /** 主板 */
private String board; /** 内存 */
private String memory; /** 机箱 */
private String crate; public String getCpu() {
return cpu;
} public void setCpu(String cpu) {
this.cpu = cpu;
} public String getBoard() {
return board;
} public void setBoard(String board) {
this.board = board;
} public String getMemory() {
return memory;
} public void setMemory(String memory) {
this.memory = memory;
} public String getCrate() {
return crate;
} public void setCrate(String crate) {
this.crate = crate;
} @Override
public String toString() {
return "Compute{" +
"cpu='" + cpu + '\'' +
", board='" + board + '\'' +
", memory='" + memory + '\'' +
", crate='" + crate + '\'' +
'}';
}
}

抽象建造者角色,抽象出组装电脑的步骤:

public interface ComputeBuilder {

    /** 组装CPU */
void buildCpu(); /** 组装主板 */
void buildBoard(); /** 组装内存 */
void buildMemory(); /** 组装机箱 */
void buildCrate(); /** 组装完成,返回一台电脑 */
Compute getCompute();
}

具体建造者角色,组装各个零件的操作:

public class ConcreteComputeBuilder implements ComputeBuilder {

    private Compute compute = new Compute();

    @Override
public void buildCpu() {
System.out.println("组装cpu");
compute.setCpu("组装cpu");
} @Override
public void buildBoard() {
System.out.println("组装主板");
compute.setBoard("组装主板");
} @Override
public void buildMemory() {
System.out.println("安装内存条");
compute.setMemory("安装内存条");
} @Override
public void buildCrate() {
System.out.println("安装机箱");
compute.setCrate("安装机箱");
} @Override
public Compute getCompute() {
return compute;
}
}

开始组装:

public class ComputeDirector {

    private ComputeBuilder builder;

    public void assemblyCompute() {
builder = new ConcreteComputeBuilder();
builder.buildCpu();
builder.buildBoard();
builder.buildMemory();
builder.buildCrate();
System.out.println(builder.getCompute());
}
}

测试类:

public class Client {
public static void main(String[] args) {
ComputeDirector director = new ComputeDirector();
director.assemblyCompute();
}
}

安装电脑思考到了Java设计模式:建造者模式的更多相关文章

  1. 3.java设计模式-建造者模式

    Java设计模式-建造者模式 在<JAVA与模式>一书中开头是这样描述建造(Builder)模式的: 建造模式是对象的创建模式.建造模式可以将一个产品的内部表象(internal repr ...

  2. 我的Java设计模式-建造者模式

    在未上大学之前,一直有个梦想"I have a dream!",就是能成为一位汽车工程师,一直幻想着开着自己设计的汽车飞奔在公路上,迷倒了万千少女.咳咳~~虽然现在没实现我的dre ...

  3. java设计模式——建造者模式

    一. 定义与类型 定义:将一个复杂对象的构建与它的表示分离,使用同样的构建过程可以创建不同的表示 用户只需制定需要建造的类型就可以得到它们,建造过程以及细节不需要知道 类型:创建型 建造者模式与工厂模 ...

  4. Java设计模式-建造者模式(Builder)

    将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示. [构建与表示分离,同构建不同表示] 与抽象工厂的区别:在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指 ...

  5. Java设计模式——建造者模式(创建型模式)

    概述   建造者模式也称为生成器模式,是一种对象创建型模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象.   建造者模式意在为重叠构造 ...

  6. Java设计模式--------建造者模式(Builder模式)

    Builder模式定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构 ...

  7. java设计模式------建造者模式

    建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 类图 描述 Builder:定义一个建造者抽象类,以规范产品对象的各个组成部分的建造.这个接口 ...

  8. Java设计模式—建造者模式

    建造模式:        将一个复杂的对象的构建与它的表示分离,使得同样的构建 过程可以创建不同的. 建造模式表示是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内 ...

  9. C#设计模式-建造者模式

    在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成. 例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象,它是由C ...

随机推荐

  1. css优先级和权重

    1. 权重概念: 权重,是一个相对的概念,是针对某一指标而言.某一指标的权重是指该指标在整体评价中的相对重要程度. 权重系数,是表示某一指标项在指标项系统中的重要程度,它表示在其它指标项不变的情况下, ...

  2. JUnit5学习之三:Assertions类

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. iframe 调用父页面元素

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="IFrame.aspx.cs ...

  4. idea更改包名无法加载主类解决

    把工程下面的.idea目录下的workspace.xml里面的路径改成你最新的路径即可. <option name="SPRING_BOOT_MAIN_CLASS" valu ...

  5. JavaScript:什么是回调?

    翻译练习 原博客地址:JavaScript: What the heck is a Callback? 在6分钟内通过简单的例子学习和理解回调的基本原理. 什么是回调? 简单地说:回调就是一个在另一个 ...

  6. CentOS rpm常用功能记录

    CentOS7主要有rpm和yum这两种包软件的管理.两者有功能上的区别,其中主要区别是:yum使用简单但需要联网,yum会去网上包源去获取所需要的软件包.而rpm的需要做的事情就更细一些,比如我们需 ...

  7. CentOS 7关闭firewalld启用iptables 开放端口

    在CentOS7中,有很多CentOS 6中的常用服务发生了变化. 其中iptables是其中比较大的一个.防火墙iptables被firewalld取代. 本文将介绍,如果采用systemctl关闭 ...

  8. 微服务网关Zuul过滤器Filter

    Zuul本质 Zuul是一个网关,关于网关的介绍参考:亿级流量架构之网关设计思路.常见网关对比, 可知Zuul是一个业务网关, 而深入了解Zuul, 基本就是一系列过滤器的集合: Zuul的过滤器 下 ...

  9. 【Azure 微服务】PowerShell中,用Connect-ServiceFabricCluster命令无法连接到sf-test.chinaeast2.cloudapp.chinacloudapi.cn:19000 问题分析

    问题描述 Azure Service Fabric提供了PowerShell的指令来进行创建,管理资源,如Get-ServiceFabricClusterHealth 获取当前集群的健康状态,但这些命 ...

  10. python 集合详解

    字符串 一个个字符组成的有序的序列,时字符的集合 使用单引,双引,三引 引住的字符序列 字符时不可变的对象 bytes定义 bytes不可变字节序列 使用b前缀定义 只允许基本ASCII使用字符形式 ...