设计模式之(6)——建造者模式

定义:建造者模式也称为生成器模式,将一个个简单对象一步步构造成一个复杂的对象,将复杂对象的构建和它的表示分离,使得同样的构建过程有不同的表示;

主要解决:系统中复杂对象的创建过程,通常由各个部分的子对象采用一定的算法构成;由于需求的变化 ,这个复杂对象的各个部分通常面临着剧烈的变化,但是将他们组合在一起的算法却相对稳定;

何时使用:一些基本部件不变,而其组合经常变化的时候;

如何解决:将变与不变相分离;

模式结构(PS:本图是从网上找过来的):

模式角色分析:

1、产品类:是一个较为复杂的对象,这个对象的创建过程较为复杂,实际编程中可以由一个抽象类和它的不同实现组成,也可以由抽象类与他们的实现组成;

2、抽象建造者:引入抽象建造者的目的,是为了将建造的具体过程交给它的子类来实现,这样更容易扩展,同时也符合面向接口编程的出发点,一般包含两个抽象方法,一个用来建造产品,一个用来返回产品;

3、建造者:实现抽象类所有未实现的方法,组件产品,返回组装好的产品;

4、指挥类:负责调用适当的建造者来组建产品,指挥类一般不与产品类发生依赖关系,与指挥类直接交互的是建造者类,一般来说指挥类被用来封装程序中易变的部分;

应用场景:

1、创建复杂对象的算法独立于组成对象的部件;

2、肯德基的汉堡、可乐、薯条、炸鸡等是不变的,而其组合是经常变化的,将不同的产品组合在一起,生成出来所谓的”套餐”;

3、jdk中的StringBuilder类;

4、同一个创建过程需要有不同的内部属性的产品对象,例如建造房子,利用沙子、水泥、钢筋既可以建造别墅也可以建造普通楼房;

优点:

1、客户端不必知道产品组成的细节,将产品本身与产品的创建过程,使得相同的创建过程可以创建不同的产品对象;

2、每个具体建造者都独立,因此可以方便地更换、或者增加具体的建造者,用户使用不同的具体建造者可以得到不同的产品对象;

3、可以更精细地控制产品的创建过程,将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰;

4、增加新的具体的建造者不需要修改原来类库的代码,指挥类针对抽象建造者类编程,系统方便扩展,符合”开闭原则”;

缺点:

1、建造者过多时,会产生很多类,难以维护;

2、建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,若产品之间的差异性很大,则不适合使用该模式,使用范围受限;

工厂模式和建造者模式联系和区别:

工厂模式重点关注如何获取实例对象,而建造者模式重点关注如何建造实例对象;建造者模式和工厂模式从总体上看仅仅是多了一个”指挥类”的角色,如果将”指挥类”看做是最终调用的客户端,那么剩余部分就可以看做是一个简单的工厂模式了,工厂模式是将实例对象的建造过程封装在工厂中了,工厂直接返回实例对象给调用者,而建造者模式是将实例对象的建造过程封装在了具体的建造者类中,由”指挥类”调用,返回对象给客户端调用;

UML类图:

示例代码:

Original: https://www.cnblogs.com/wha6239/p/16643030.html
Author: 一只烤鸭朝北走
Title: 设计模式之(6)——建造者模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612886/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 一文说透 MySQL JSON 数据类型(收藏)

    JSON 数据类型是 MySQL 5.7.8 开始支持的。在此之前,只能通过字符类型(CHAR,VARCHAR 或 TEXT )来保存 JSON 文档。 相对字符类型,原生的 JS…

    数据库 2023年5月24日
    067
  • MySQL学习(3)—MySQL常用命令

    ps:此随笔基于mysql 5.7.*版本。 准备 net start mysql 启动MySQL服务 net stop mysql 关闭MySQL服务 mysql [-h exi…

    数据库 2023年5月24日
    068
  • MySQL数据库-数据表(中)

    分析:给 reader 表添加数据. INSERT INTO:插入数据,插入数据的时候会检查主键或者唯一索引,如果出现重复就会报错; 语法:INSERT INTO table_na…

    数据库 2023年6月11日
    093
  • MySQL max() min() 函数取值错误

    今天日志出现异常,一步一步debug发现SQL语句返回值出错,进一步发现是max()函数返回出错。点击跳转解决办法,赶时间的朋友可以去获得答案。当然我还是希望大伙看看原由。 sel…

    数据库 2023年6月16日
    0167
  • MySQL之select 语句的执行顺序

    mysql语句编写顺序 ① select 字段名 ② from &am…

    数据库 2023年5月24日
    076
  • Qt 圆角头像的实现

    在QT 中设置圆形头像,本文记录了两个解决思路。 将头像显示在QLabel 此类控件中,设置QLabel 为一个正方形,接着设置QLabel 的圆角属性,可以实现圆形头像的效果。 …

    数据库 2023年6月16日
    095
  • Java面试题(四)–RabbitMQ

    1、MQ有哪些使用场景?(高频) 异步处理:用户注册后,发送注册邮件和注册短信。用户注册完成后,提交任务到 MQ,发送模块并行获取 MQ 中的任务。 系统解耦:比如用注册完成,再加…

    数据库 2023年6月16日
    068
  • Git命令列表–git-config

    git config 查看、编辑Git的配置文件 配置文件的范围和语法 $ git config usage: it config [] Config file location …

    数据库 2023年6月11日
    075
  • Stripe支付介绍在asp.net mvc中开发对接,图文加代码说明

    最近一个国外的电商项目,需要对接支付功能,国内的支付一般使用微信支付、支付宝、银联等等,但国际上一般使用Paypal、Skrill、BrainTree、Stripe等,经过内部综合…

    数据库 2023年6月14日
    094
  • 前后端数据交互利器–Protobuf

    Protobuf 介绍 简而言之,Protobuf 是 Google 开源的一款用于处理前后端数据交互格式的工具。通常来讲前后端使用的编程语言是不同的,使用 Protobuf无需多…

    数据库 2023年6月16日
    083
  • RadonDB MySQL Kubernetes 2.2.0 发布!

    摘要 RadonDB MySQL Kubernetes v2.2.0 于近日发布!该版本开始支持 MySQL 8.0,备份功能优化,并全面提升高可用稳定性。社区同步发起&#8221…

    数据库 2023年5月24日
    095
  • SQL优化

    一、插入优化 批量插入 insert into tb_name values (1,"张三"),(2,"张三"),(3,"张三&q…

    数据库 2023年5月24日
    071
  • 23种设计模式之访问者模式(Visitor Pattern)

    文章目录 概述 访问者模式的优缺点 访问者模式的使用场景 访问者模式的结构和实现 * 模式结构 模式实现 总结 概述 访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可…

    数据库 2023年6月6日
    081
  • 23种设计模式之命令模式和策略模式的区别

    命令模式和 策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色。它们虽然同为行为类模式,但是两者的区别还是很明显的。策略模式的意图是封装算法,它认为&#8221…

    数据库 2023年6月6日
    076
  • Kafka集群部署

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月16日
    065
  • Vue 3.x基础

    Vue 3.x基础 模版 <template> // html </template> <script setup> // setup API …

    数据库 2023年6月11日
    068
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球