设计模式之四 --- 建造(Builder)模式

2023-10-27

【1】基本概念

建造(Builder)模式是一种对象构建的设计模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

【2】简单分析

我们先来看一下该设计模式的UML结构图


上图是Strategy 模式的结构图,让我们可以进行更方便的描述:

  • Builder
为创建一个Product对象的各个部件指定抽象接口。
  • ConcreteBuilder
实现Builder的接口以构造和装配该产品的各个部件。
定义并明确它所创建的表示。
提供一个检索产品的接口
  • Director
构造一个使用Builder接口的对象。
  • Product
表示被构造的复杂对象。ConcreateBuilder创建该产品的内部表示并定义它的装配过程。
在以下情况使用生成器模式:
包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
  • 当创建复杂对象(这些对象内部构建间的建造顺序通常是稳定的)的算法应该独立于该对象的组成部分以及它们的装配方式时;
  • 当构造过程必须允许被构造的对象有不同的表示时。

【3】 如何用java语言来实现该模式

下面以一个简单的例子来展示该模式,先看下代码结构图:


3.1 先创建一个Product类--产品类:

package com.andyidea.patterns.product; /** * Product--产品类 * @author Andy.Chen * */ public class Pizza { private String dough; private String sauce; private String topping; public void setDough(String dough) { this.dough = dough; } public void setSauce(String sauce) { this.sauce = sauce; } public void setTopping(String topping) { this.topping = topping; } }3.2 创建抽象建造者类:PizzaBuilder.java

package com.andyidea.patterns.builder; import com.andyidea.patterns.product.Pizza; /** * Builder类--抽象建造者类 * @author Andy.Chen * */ public abstract class PizzaBuilder { protected Pizza pizza; public Pizza getPizza() { return pizza; } public void createNewPizzaProduct() { pizza = new Pizza(); } public abstract void buildDough(); public abstract void buildSauce(); public abstract void buildTopping(); }3.3 创建具体建造者类

HawaiianPizzaBuilder.java源码:

package com.andyidea.patterns.concretebuilder; import com.andyidea.patterns.builder.PizzaBuilder; /** * ConcreteBuilder类--具体建造者类 * @author Andy.Chen * */ public class HawaiianPizzaBuilder extends PizzaBuilder { @Override public void buildDough() { System.out.println("Hawaiian-Dough"); pizza.setDough("Hawaiian-Dough"); } @Override public void buildSauce() { System.out.println("Hawaiian-Sauce"); pizza.setSauce("Hawaiian-Sauce"); } @Override public void buildTopping() { System.out.println("Hawaiian-Topping"); pizza.setTopping("Hawaiian-Topping"); } }SpicyPizzaBuilder.java源码:

package com.andyidea.patterns.concretebuilder; import com.andyidea.patterns.builder.PizzaBuilder; /** * ConcreteBuilder类--具体建造者类 * @author Andy.Chen * */ public class SpicyPizzaBuilder extends PizzaBuilder { @Override public void buildDough() { System.out.println("Spicy-Dough"); pizza.setDough("Spicy-Dough"); } @Override public void buildSauce() { System.out.println("Spicy-Sauce"); pizza.setSauce("Spicy-Sauce"); } @Override public void buildTopping() { System.out.println("Spicy-Topping"); pizza.setTopping("Spicy-Topping"); } }3.4 创建指挥者(Director)类:Waiter.java

package com.andyidea.patterns.director; import com.andyidea.patterns.builder.PizzaBuilder; import com.andyidea.patterns.product.Pizza; /** * Director类--指挥者类 * @author Andy.Chen * */ public class Waiter { private PizzaBuilder pizzaBuilder; public void setPizzaBuilder (PizzaBuilder pb) { pizzaBuilder = pb; } public Pizza getPizza() { return pizzaBuilder.getPizza(); } public void constructPizza() { pizzaBuilder.createNewPizzaProduct(); pizzaBuilder.buildDough(); pizzaBuilder.buildSauce(); pizzaBuilder.buildTopping(); } }3.5 测试类:BuilderClient.java

package com.andyidea.patterns.client; import com.andyidea.patterns.builder.PizzaBuilder; import com.andyidea.patterns.concretebuilder.HawaiianPizzaBuilder; import com.andyidea.patterns.concretebuilder.SpicyPizzaBuilder; import com.andyidea.patterns.director.Waiter; import com.andyidea.patterns.product.Pizza; public class BuilderClient { public static void main(String[] args) { System.out.println("Welcome to Andy.Chen Blog!" +"\n" +"Builder Patterns." +"\n"); Waiter waiter = new Waiter(); PizzaBuilder hawaiian_pizzabuilder = new HawaiianPizzaBuilder(); PizzaBuilder spicy_pizzabuilder = new SpicyPizzaBuilder(); System.out.println("------------HawaiianPizza------------"); waiter.setPizzaBuilder(hawaiian_pizzabuilder); waiter.constructPizza(); System.out.println("------------SpicyPizza------------"); waiter.setPizzaBuilder(spicy_pizzabuilder); waiter.constructPizza(); Pizza pizza = waiter.getPizza(); } }【4】程序运行结果:

Welcome to Andy.Chen Blog! Builder Patterns. ------------HawaiianPizza------------ Hawaiian-Dough Hawaiian-Sauce Hawaiian-Topping ------------SpicyPizza------------ Spicy-Dough Spicy-Sauce Spicy-Topping通过上面我们可以看到:建造者模式的好处就是使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需要再定义一个具体的建造者就可以了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计模式之四 --- 建造(Builder)模式 的相关文章

随机推荐

  • electron入门案例

    目录解构 main js 主进程文件 用来控制整个应用程序 仅有一个 index html 渲染模板 render index js 渲染进程文件 用来控制页面的渲染 可有多个 package json 依赖包 主进程代码 在electro
  • 四. ZooKeeper 作为 SpringCloud 注册中心配置

    目录 一 简单概述 二 配置服务注册到 ZooKeeper 1 服务提供方 yml 文件配置注册到 ZooKeeper 2 服务消费方 yml 文件配置注册到 ZooKeeper 3 服务消费方配置 RestTemplate 注入到容器中
  • 【JAVA】我们常常谈到的方法是指什么?

    个人主页 个人主页 系列专栏 初识JAVA 文章目录 前言 方法 方法的分类 方法的定义 方法调用 方法重载 前言 在之前的文章中我们总是会介绍到类中的各式各样的方法 也许在应用中我们对它已经有了初步的了解 今天我们就来详细的介绍一下 方法
  • 经典卷积神经网络(CNN)图像分类算法详解

    本文原创 转载请引用 https blog csdn net dan teng article details 87192430 CNN图像分类网络 一点废话 CNN网络主要特点是使用卷积层 这其实是模拟了人的视觉神经 单个神经元只能对某种
  • QT获取一些机器相关信息的方法

    获取机器码的方法 按照注释传入相应的参数 即可获得对应的码 获取cpu名称 wmic cpu get Name 获取cpu核心数 wmic cpu get NumberOfCores 获取cpu线程数 wmic cpu get Number
  • 手把手教你对接快手小店开发者商家应用

    不懂就问 什么是快手小店 A 快手小店是快手电商于2018年6月推出的 后续以京东作为供应链 在短视频 直播中打开电商的新纪元 与其可以同态竞技的有抖音小店 以及淘宝直播 那么 要对接快手小店的接口 就需要申请快手开发者 在开发者账户内新建
  • 【Vue入门】语法 —— 插值、指令、过滤器、计算属性、监听器

    目录 一 模版语法 1 1 插值 1 1 1 文本 1 1 2 html解析 1 1 3 属性 1 1 4 表达式 1 2 指令 1 2 1 核心指令 1 2 3 动态参数 二 过滤器 2 1 局部过滤器 2 2 全局过滤器 三 计算属性
  • CRC 校验计算

    一 简介 CRC即循环冗余校验码 Cyclic Redundancy Check 是数据通信领域中最常用的一种查错校验码 其特征是信息字段和校验字段的长度可以任意选定 其根本思想就是先在要发送的帧后面附加校验码 再发送给接收端 校验码要使所
  • python opengl 入门

    安装 pip install pyglet 入门demo import pyglet window pyglet window Window label pyglet text Label Hello world font name Tim
  • 图像语义分割概述

    图像语义分割概述 一 图像语义分割概念 图像语义分割 Image Semantic Segmentation 是一项计算机视觉任务 其目标是将输入的图像分割成多个区域 并为每个像素分配一个语义类别标签 以表示该像素属于图像中的哪个物体或区域
  • WheelCollider笔记

    The Wheel Collider is a special collider for grounded vehicles It has built in collision detection wheel physics and a s
  • Sapir—Whorf Hypothesis (萨皮尔—沃尔夫假说)

    Sapir Whorf Hypothesis 萨皮尔 沃尔夫假说 Sapir Whorf Hypothesis 的思想源头可追溯到德国哲学家海德 G Herder 1744 1803 Wilhelm von Humboldt 1762 18
  • win11本地安全机构保护已关闭怎么办?如何修复windows11本地安全机构保护已关闭?

    win11本地安全机构保护已关闭怎么办 如何修复windows11本地安全机构保护已关闭 近日有windows11系统用户反映说遇到了这样一个问题 启动电脑后 发现windows右下角的安全中心图标上会显示一个黄色叹号 打开windows安
  • Android中的列表树形展示,AndroidTreeView的使用动态设置树形结构

    1 在项目中用到了这个控件 展示并选择某公司的部门 但是在使用过程中又出一个问题 我并不知道该公司有几个部门 部门下面是否有子部门 2 实现步骤如下 开发工具 Android studio 在项目中添加依赖 compile com gith
  • Android 10.0 修改SystemUI下拉QSPanel功能开关的显示顺序

    1 概述 在10 0的系统产品开发中 在对SystemUI下拉展开时 原生SystemUI会对下拉快捷功能键顺序排序 而 产品需求要求在QSPanel的功能开关顺序需要做调整 也就是要修改config xml中的显示顺序 然后在加载QSPa
  • STM32自带RTC时钟

    上面是我的微信和QQ群 欢迎新朋友的加入 没有使用32M的那个时钟 正确的应该是用那个的 现在的配置只是让RTC跑起来 生成工程 自动给我声明了两个结构体 打开结构体 看到的是一些跟时间相关的东西 找到四个函数 读取和设置时间日期 进入大循
  • XSS-labs-level4详解

    访问题目url 直接经典代码起手 查看界面回显发现表单中的尖括号都消失了 我们直接去看源代码
  • 单片机电子时钟的设计(期末课程设计)

    题目 单片机电子时钟的设计 设计一个时钟 可以正常显示时分秒 也可以通过按键改变分钟和小时 且有整点提醒功能 1 能够正常计时并且能够显示小时 分钟 秒 10分 1 正常显示秒 2分 2 正常显示分 2分 3 正常显示时 2分 4 秒进位至
  • ULAM公链第七十六期工作总结

    ULAM公链第七十六期工作总结 那些看上去光鲜的人背后一定经历过万千烦恼 没有谁的成功都是一蹴而就的 你受的委屈 摔的伤痕 背的冷眼 别人都有过 他们身上有光 是因为扛下了黑暗 生活给了一个人多少磨难 日后必会还给他多少幸运 为梦想颠簸的人
  • 设计模式之四 --- 建造(Builder)模式

    1 基本概念 建造 Builder 模式是一种对象构建的设计模式 它可以将复杂对象的建造过程抽象出来 抽象类别 使这个抽象过程的不同实现方法可以构造出不同表现 属性 的对象 2 简单分析 我们先来看一下该设计模式的UML结构图 上图是Str