设计模式篇---建造者模式

文章目录

    • 概念
    • 结构
    • 实例
    • 总结

概念

建造者模式的定义:将一个复杂对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示。
这么看起来有点难以理解,翻译一下就是 用户无需关注创建复杂对象的过程,只需要指定创建的对象即可。比如用户要一辆车,他不需要关注创建车的细节,只需要指定要什么牌子的车即可,创建车的过程就是对象的构建,用户要的车就是对象的表示,这两个是分离开的。

结构

建造者模式主要由以下4部分组成
抽象建造者(Builder):它是一个接口或者抽象类。是具体建造者的父类,主要作用是创建复杂对象的各个组件和返回创建的好的对象。
具体建造者(ConcreteBuilder):它是抽象建造者的实现,实现了对象每个组件的创建并返回明确的对象。
产品(Product):它是复杂的对象,包含多个组件,具体建造者创建该产品的内部并定义它的装配过程。
指挥者(Director):指挥者主要用来安排创建负责对象的建造顺序。客户端只需要和指挥者进行交互,客户端制定好创建者的类型(并不是产品的类型),然后由指挥者返回创建好的对象。

在这里插入图片描述

实例

有一家游戏公司,在游戏中玩家可以创建不同的角色,比如骑士、公主、恶魔等,每个角色都有一些属性,例如力量、技能、面容等。这些复杂的角色创建过程都是类似的,对于这些角色的创建,我们可以使用建造者模式。

游戏角色类。

@Data
public class Actor {private String type; //角色类型private String sex; //性别private String face; //脸型private String costume; //服装private String hairstyle; //发型
}

游戏建造者类,充当抽象建造者。

public abstract class ActorBuilder {protected Actor actor = new Actor();public abstract void buildType();public abstract void buildSex();public abstract void buildFace();public abstract void buildCostume();public abstract void buildHairstyle();//工厂方法,返回一个完整的游戏角色对象public Actor createActor() {return actor;}}

英雄建造者,具体的建造者。

public class HeroBuilder  extends  ActorBuilder{@Overridepublic void buildType() {actor.setType("英雄");}@Overridepublic void buildSex() {actor.setSex("男");}@Overridepublic void buildFace() {actor.setFace("英俊");}@Overridepublic void buildCostume() {actor.setCostume("盔甲");}@Overridepublic void buildHairstyle() {actor.setHairstyle("飘逸");}
}

天使建造者,充当具体的建造者

public class AngelBuilder extends ActorBuilder{@Overridepublic void buildType() {actor.setType("天使");}@Overridepublic void buildSex() {actor.setSex("女");}@Overridepublic void buildFace() {actor.setFace("漂亮");}@Overridepublic void buildCostume() {actor.setCostume("白裙");}@Overridepublic void buildHairstyle() {actor.setHairstyle("披肩长发");}
}

角色控制器,充当指挥者。

public class ActorDirector {public Actor construct(ActorBuilder actorBuilder) {actorBuilder.buildType();actorBuilder.buildSex();actorBuilder.buildFace();actorBuilder.buildCostume();actorBuilder.buildHairstyle();return actorBuilder.createActor();}}

客户端测试

public class Client {public static void main(String[] args) {ActorDirector actorDirector = new ActorDirector();Actor hero = actorDirector.construct(new HeroBuilder());System.out.println(hero);Actor angle = actorDirector.construct(new AngelBuilder());System.out.println(angle);}}

打印结果
在这里插入图片描述

总结

建造者模式的优点:
1、客户端不需要关注具体创建的细节,只需要指定创建者即可。
2、相同的创建可以创建不同的产品对象。
3、每个建造者不相互影响,符合开闭原则,便于扩展。
4、可以控制创建对象的顺序。

建造者模式的缺点:
1、当各个产品之间的差异很大时,不适合使用建造者模式,因此其使用范围受到了一定的限制。
2、当具体建造者过多时,如果父类扩展新的抽象方法,则维护起来比较困难。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/9490.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多元回归预测 | Matlab基于粒子群算法优化深度置信网络(PSO-DBN)的数据回归预测,matlab代码回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于基于粒子群算法优化深度置信网络(PSO-DBN)的数据回归预测,matlab代码回归预测,多变量输入模型,多变量输入模型 评价

计算机网络_ 1.3 网络核心(数据交换_电路交换_多路复用)

计算机网络_数据交换_电路交换_多路复用 多路复用频分多路复用FDM时分多路复用TDM波分多路复用WDM码分多路复用CDM 多路复用 多路复用(Multiplexing),简称复用,是通信技术的基本概念。 链路/网络资源(如带宽&#x…

浅谈数据中心机房动环监控系统可视化设计与研究

安科瑞电气股份有限公司 上海嘉定 201801 摘要:为了维护好数据中心机房动力环境,及时发现隐患和排除故障,降低管理成本控制能耗,提高运维效率,保障数据中心安全、高效、环保、稳定的运行,针对目前机房管理…

云原生(第四篇)-k8s yaml文件

Kubernetes 支持 YAML 和 JSON 格式管理资源对象 JSON 格式:主要用于 api 接口之间消息的传递 YAML 格式:用于配置和管理,YAML 是一种简洁的非标记性语言,内容格式人性化,较易读 YAML 语法格式: ●大小写敏…

mysql redis区别

一、.redis和mysql的区别总结 (1)类型上 从类型上来说,mysql是关系型数据库,redis是缓存数据库 (2)作用上 mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢 redis用于存储使…

RabbitMQ的基本概念和七种队列模式

I. RabbitMQ的基本概念 1. 生产者/消费者 生产者(Producer) 消息的创建者。 负责创建和推送数据到消息服务器。 消费者(Consumer) 消息的接收方。 负责接收消息和处理数据。 2. 消息队列(Queue) 消息队列是RabbitMQ的内部对象,用于存储生产者的消息直到发送给消…

[SSM]MyBatis常用技巧和参数处理

目录 八、MyBatis小技巧 8.1#{}和${} 8.2别名机制:typeAliases 8.3mappers ​编辑 8.4IDEA配置文件模板 8.5插入数据时获取自动生成的主键 九、MyBatis参数处理 9.1单个简单参数类型 9.2Map参数 9.3实体类参数 9.4多参数 9.5Param注解(命名…

封装一个类似微信通讯录带有字母检索功能的vue组件

这里我们直接使用scrollIntoView方法 该方法将调用它的元素滚动到浏览器窗口的可见区域 语法 element.scrollIntoView(); // 等同于element.scrollIntoView(true) element.scrollIntoView(alignToTop); //布尔参数 element.scro…

编译Android平台的OpenCV库并启用OpenCL及Contrib

1.下载好OpenCV与OpenCV_Contirb 版本: 4.7 编译主机系统: Ubuntu 20.04 LTS 准备环境与工具: ANDRIOD SDK 与 NDK ,CMAKE ,NINJA ,GCC,G++ ,MAKE 开始编译: ../opencv/platforms/android/build_sdk.py --extra_modules_path=../opencv_contrib/modules --no_samples_bu…

想知道好用的音频翻译软件有哪些?

随着全球化进程的加速和语言交流需求的增长,音频翻译软件正日益受到关注和应用。这样的软件以其高效、准确的翻译能力以及广泛的应用场景赢得了青睐。音频翻译软件具备诸多优势,如通过语音输入实时转化为文字输出,提供了便捷的写作工具&#…

1.监控分布式--zabbix

文章目录 监控分布式-zabbix、prometheus概念工作原理功能组件部署zabbix安装Nginx和PHP环境部署数据库编码安装zabbix编译安装zabbix server客户端安装zabbix agent服务 监控分布式-zabbix、prometheus 利用一个优秀的监控软件,我们可以: 通过一个友好的界面进行…