当前位置: 首页 > news >正文

Java设计模式之建造者模式

建造者模式,又称生成器模式:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

三个角色:建造者具体的建造者监工使用者

  • 建造者角色:定义生成实例所需要的所有方法;
  •  具体的建造者角色:实现生成实例所需要的所有方法,并且定义获取最终生成实例的方法;
  •  监工角色:定义使用建造者角色中的方法来生成实例的方法;
  •  使用者:使用建造者模式。

注意:定义中“将一个复杂的构建过程与其表示相分离”,表示并不是由建造者负责一切,而是由监工负责控制(定义)一个复杂的构建过程,由各个不同的建造者分别负责实现构建过程中所用到的所有构建步骤。不然,就无法做到“使得同样的构建过程可以创建不同的表示”这一目标。

建造者角色:

public abstract class Builder {public abstract void buildPart1();public abstract void buildPart2();public abstract void buildPart3();
}

监工角色:

public class Director {    // 将一个复杂的构建过程与其表示相分离private Builder builder;    // 针对接口编程,而不是针对实现编程public Director(Builder builder) {this.builder = builder;}public void setBuilder(Builder builder) {this.builder = builder;}public void construct() {   // 控制(定义)一个复杂的构建过程builder.buildPart1();for (int i = 0; i < 5; i++) {   // 提示:如果想在运行过程中替换构建算法,可以考虑结合策略模式。builder.buildPart2();}builder.buildPart3();}
}

具体的建造者角色:

/*** 此处实现了建造纯文本文档的具体建造者。* 可以考虑再实现一个建造HTML文档、XML文档,或者其它什么文档的具体建造者。* 这样,就可以使得同样的构建过程可以创建不同的表示*/
public class ConcreteBuilder1 extends Builder {private StringBuffer buffer = new StringBuffer();//假设 buffer.toString() 就是最终生成的产品@Overridepublic void buildPart1() {//实现构建最终实例需要的所有方法buffer.append("Builder1 : Part1\n");}@Overridepublic void buildPart2() {buffer.append("Builder1 : Part2\n");}@Overridepublic void buildPart3() {buffer.append("Builder1 : Part3\n");}public String getResult() {//定义获取最终生成实例的方法return buffer.toString();}
}

客户角色:

public class Client {public void testBuilderPattern() {ConcreteBuilder1 b1 = new ConcreteBuilder1();//建造者Director director = new Director(b1);//监工director.construct();//建造实例(监工负责监督,建造者实际建造)String result = b1.getResult();//获取最终生成结果System.out.printf("the result is :%n%s", result);}
}

http://www.lryc.cn/news/141424.html

相关文章:

  • H5商城公众号商城系统源码 积分兑换商城系统独立后台
  • 华为OD机试 - 完全数计算(Java 2023 B卷 100分)
  • 每日一学——Vlan配置
  • Pimpl模式
  • Python 密码破解指南:5~9
  • ARM驱动开发
  • Matlab图像处理-加法运算
  • Docker容器学习:搭建自己专属的LAMP环境
  • 问道管理:沪指弱势震荡跌0.38%,金融、地产等板块走弱,算力概念等活跃
  • OpenWrt package - BuildPackage
  • C++三体星战小游戏
  • 【zip密码】修改zip压缩包密码
  • 小小讲一下Linux基本命令
  • Python数据容器(列表list、元组tuple、字符串str、字典dict、集合set)详解
  • 2023高教社杯数学建模思路 - 复盘:人力资源安排的最优化模型
  • Linux 计算机网络基础概论
  • 深入理解 C++ 中的 std::cref、std::ref 和 std::reference_wrapper
  • 在其他python环境中使用jupyter notebook
  • 计算机网络-笔记-第二章-计算机网络概述
  • Hive字符串数组json类型取某字段再列转行
  • ElementUI Table 翻页缓存数据
  • 使用 AutoGPTQ 和 transformers 让大语言模型更轻量化
  • AUTOSAR规范与ECU软件开发(实践篇)6.5 BswM模块概念与配置方法介绍
  • 1.1 VMware Workstation与Kali的安装和配置1
  • DDR与PCIe:高性能SoC的双引擎
  • C#_特性反射详解
  • 【跟小嘉学 Rust 编程】十三、函数式语言特性:迭代器和闭包
  • 时间复杂度和空间复杂度
  • mac docker 卡住解决
  • linux/centos zookeeper 使用记录