Java设计模式-建造者模式

news2024/11/26 8:07:02

img

简介

建造者模式是一种创建型设计模式,用于将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。建造者模式通过将复杂对象的构建过程分解为多个简单的步骤来实现。

与其他创建型模式不同,建造者模式强调的是将构建过程与表示分离,而不是将对象与其构建方式分离。这使得建造者模式在需要创建多个相似对象时非常有用,因为可以通过重用相同的构建过程来创建不同的对象表示。

建造者模式与工厂模式和抽象工厂模式非常相似,它们都是用来创建对象的。然而,它们之间存在一些区别:

  • 工厂模式和抽象工厂模式用于创建不同类型的对象,而建造者模式用于创建同一类型的不同表示。
  • 工厂模式和抽象工厂模式只有一个创建方法,而建造者模式通常有多个创建方法。
  • 工厂模式和抽象工厂模式通常创建完整的对象,而建造者模式创建对象的过程是分步的。

实现

假设我们正在构建一个游戏,游戏中有多种类型的角色,每种角色都有不同的属性和装备。为了避免在创建每个角色时重复的代码,我们可以使用建造者模式。

下面是一个简单的示例,它演示了如何使用建造者模式创建不同类型的游戏角色:

public interface RoleBuilder {
    void setName(String name);
    void setHealth(int health);
    void setAttack(int attack);
    void setDefense(int defense);
    void setEquipment(String equipment);
    Role build();
}

public class WarriorBuilder implements RoleBuilder {
    private Role role = new Role();

    public void setName(String name) {
        role.setName(name);
    }

    public void setHealth(int health) {
        role.setHealth(health);
    }

    public void setAttack(int attack) {
        role.setAttack(attack);
	}

	public void setDefense(int defense) {
    	role.setDefense(defense);
	}

	public void setEquipment(String equipment) {
    	role.setEquipment(equipment);
	}

	public Role build() {
    	return role;
	}
}

public class Role {
	private String name;
	private int health;
	private int attack;
	private int defense;
	private String equipment;
    // getters and setters
}

public class Game {
	public static void main(String[] args) {
		RoleBuilder warriorBuilder = new WarriorBuilder();
		RoleBuilder mageBuilder = new MageBuilder();
        // Create a warrior
    	warriorBuilder.setName("Warrior");
    	warriorBuilder.setHealth(100);
    	warriorBuilder.setAttack(10);
    	warriorBuilder.setDefense(5);
    	warriorBuilder.setEquipment("Sword");
    	Role warrior = warriorBuilder.build();

    	// Create a mage
    	mageBuilder.setName("Mage");
    	mageBuilder.setHealth(80);
    	mageBuilder.setAttack(20);
    	mageBuilder.setDefense(3);
    	mageBuilder.setEquipment("Staff");
    	Role mage = mageBuilder.build();
	}
}

在上面的示例中,我们使用了RoleBuilder接口来定义了创建Role对象的方法,然后我们创建了两个具体的建造者WarriorBuilderMageBuilder,它们分别用于创建战士和法师。最后,我们使用这些建造者来创建不同类型的游戏角色。

优缺点

优点

  • 可以将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
  • 可以更容易地控制对象的创建过程,同时使得代码更易于维护和扩展。
  • 可以避免在创建对象时重复的代码,提高了代码的复用性。

缺点

  • 建造者模式的代码结构较为复杂,需要创建多个类来实现。
  • 当需要创建的对象较为简单时,建造者模式可能会显得过于繁琐。

运用场景

建造者模式通常适用于以下情况:

  • 当需要创建多个相似对象时,例如使用相同的构建过程创建不同的表示。
  • 当创建一个对象需要多个步骤时,例如需要设置多个属性或调用多个方法。
  • 当需要在不同的上下文中创建不同的对象表示时,例如根据用户的选择创建不同的表示。
  • 当需要控制对象的创建过程,并且希望代码易于维护和扩展时。

总结

建造者模式是一种创建型设计模式,用于将复杂对象的构建过程与其表示分离。它通过将复杂对象的构建过程分解为多个简单的步骤来实现。在Java中,我们可以使用建造者模式来创建复杂对象,并且可以根据需要使用不同的建造者来创建不同的表示。建造者模式的优点包括可重用性和易于维护和扩展,但它的缺点是代码结构较为复杂。建造者模式适用于需要创建多个相似对象,或者需要在不同的上下文中创建不同的对象表示的情况。如果需要创建的对象较为简单,可能会使用建造者模式变得过于繁琐。

总之,建造者模式是一种非常有用的设计模式,可以帮助我们更好地管理对象的构建过程,并且使得代码更加易于维护和扩展。如果你需要创建一个复杂的对象,或者需要在不同的上下文中创建不同的对象表示,建议你考虑使用建造者模式来实现。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QML路径视图(The PathView)

路径视图(PathView)非常强大,但也非常复杂,这个视图由QtQuick提供。它创建了一个可以让子项沿着任意路径移动的视图。沿着相同的路径,使用缩放(scale),透明(opacity&…

nssctf (1)

[NISACTF 2022]popchains Happy New Year~ MAKE A WISH <?phpecho Happy New Year~ MAKE A WISH<br>;if(isset($_GET[wish])){ #通过get获取wish的值 并判断是不是空@unserialize($_GET[wish]); #反序列化wish } else{$a=new Road_is_Long; #实例化Road_is…

YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制

YOLOv5&#xff1a;添加SE、CBAM、CoordAtt、ECA注意力机制 前言前提条件相关介绍注意力机制SE添加SE注意力机制到YOLOv5 CBAM添加CBAM注意力机制到YOLOv5 CoordAtt添加CoordAtt注意力机制到YOLOv5 ECA添加ECA注意力机制到YOLOv5 参考 前言 记录在YOLOv5添加注意力机制&#xf…

原神3.2真端完整版架设教程

想必在座的各位都玩过这款游戏吧、开放世界的玩法、折磨人的剧情、做不完的任务、话多且烦人的派蒙、没眼看的伤害、贵到爆的抽卡、打不动的深渊、树脂刷空也刷不到想要的圣遗物、打不动的BOSS、这怎么受得了呀!反正我是受不了。废话不多说、教程开始。 准备工具: 一台16H 3…

【经典面试题】请使用C语言编程实现对IPV4地址的合法性判断

C语言编程实现对IPV4地址的合法性判断 有了解过我的朋友&#xff0c;可能有点印象&#xff0c;我在N年前的博客中&#xff0c;就写了这个主题&#xff0c;当时确实是工作中遇到了这个问题。本想着等工作搞完之后&#xff0c;就把这个问题的解决代码补上&#xff0c;结果一鸽&am…

MATLAB实现工业PCB电路板缺陷识别和检测

PCB&#xff08;PrintedCircuitBoard印刷电路板&#xff09;是电子产品中众多电子元器件的承载体&#xff0c;它为各电子元器件的秩序连接提供了可能&#xff0c;PCB已成为现代电子产品的核心部分。随着现代电子工业迅猛发展&#xff0c;电子技术不断革新&#xff0c;PCB密集度…

K8S常见异常事件与解决方案

集群相关 Coredns容器或local-dns容器重启 集群中的coredns组件发生重启(重新创建)&#xff0c;一般是由于coredns组件压力较大导致oom&#xff0c;请检查业务是否异常&#xff0c;是否存在应用容器无法解析域名的异常。 如果是local-dns重启&#xff0c;说明local-dns的性能…

fastai2 实现SSD

https://github.com/search?qfastaissd 有几个值得参考的代码&#xff0c;好好学习。 GitHub - Samjoel3101/SSD-Object-Detection: I am working on a SSD Object Detector using fastai and pytorch fastai2实现的SSD&#xff0c;终于找到了code。https://github.com/sidrav…

等保定级怎么做

Q25:现在还没做等保还来得及吗?有什么影响? 答:来得及。种一棵树,最好的时间是十年前,其次是现在。可先根据定级备案要求和流程,先向公安递交定级备案文件,测评与整改预算提上日程,在经费未落实前,可以先进行系统定级、差距分析、整改计划制订等工作。 根据《等保工…

LVGL移植——stm32f4

LVGL移植说明 移植LVGL版本&#xff1a;8.3.6 主控&#xff1a;STM32F407ZGT6 github链接&#xff1a;https://github.com/lvgl/lvgl.git 文章目录 LVGL移植说明STM32移植LVGL①需要的依赖文件②移植显示驱动文件③将文件加入工程当中④配置心跳④修改栈堆的空间⑤编译链接 STM…

02-权限提升-Win溢出漏洞及ATSCPS提权

权限提升-Win溢出漏洞及AT&SC&PS提权 思维导图 明确权限提升基础知识&#xff1a;权限划分 明确权限提升环境问题&#xff1a;web及本地 web提权&#xff1a;已有网站权限&#xff08;可以操作网站内容&#xff0c;但无法操作服务器&#xff09;&#xff0c;想要获得…

【软考中级】2022下半年软件设计师综合知识真题与答案

1、以下关于R1SC(精简指令集计算机)特点的叙述中&#xff0c;错误的是()。 A.对存储器操作进行限制&#xff0c;使控制简单化 B.指令种类多&#xff0c;指令功能强 C.设置大量通用寄存器 D.选取使用频率较高的一些指令&#xff0c;提高执行速度 参考答案&#xff1a;B 2、…

Qt6之KDE框架

25年来&#xff0c;KDE社区一直在使用Qt开发各种自由软件产品。其中包括Plasma桌面环境&#xff0c;像Krita和Kdenlive这样的创意工具&#xff0c;像GCompris这样的教育应用程序&#xff0c;像Kontact这样的群件套件以及无数其他应用程序&#xff0c;实用程序和小部件。 Qt以其…

Shell+VCS学习3---VCS命令

1 VCS介绍 VCS的功能可以大致分为两个大类&#xff1a;编译和仿真。 VCS编译的过程&#xff0c;就是经过一系列的操作&#xff0c;将verilog代码转换为可执行文件&#xff08;.svim&#xff09;&#xff0c;接下来就是用dve进行仿真过程生成.vpd波形文件。 VCS是编译型verilo…

C++---树形DP---树的最长路径(每日一道算法2023.5.4)

注意事项&#xff1a; 本题为"树与图的DFS深度优先遍历—树的重心"的近似题&#xff0c;同时涉及到 单链表模拟邻接表存储图 的操作&#xff0c;建议先理解那篇文章。 题目&#xff1a; 给定一棵树&#xff0c;树中包含 n 个结点&#xff08;编号1~n&#xff09;和 …

JavaScript:栈和对列

文章目录 栈和对列Js 有栈与队列吗20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09;思路 1047. 删除字符串中的所有相邻重复项 - 力扣&#xff08;LeetCode&#xff09;思路代码分析array.join() 操作打印const s of str 操作遍历 150. 逆波兰表达式求值 - 力扣&#xf…

(1)QT基础铺垫

目录 1.Qt特性 2. 新建项目 3. 工作目录与构建目录 4. 工作目录 4.1 .pro 项目配置文件 4.2 dialog.h 4.3 dialog.cpp 4.4 main.cpp 5. 帮助文档 6. 调试信息 1.Qt特性 Qt经常被当作是一个基于c语言的gui开发框架&#xff0c;但是这并不是qt的全部&#xff0c;除了开…

助力工业物联网,工业大数据之ODS层构建:申明分区代码及测试【十】

文章目录 知识点13&#xff1a;ODS层构建&#xff1a;申明分区代码及测试知识点14&#xff1a;ODS层与DWD层区别知识点15&#xff1a;DWD层构建&#xff1a;需求分析知识点16&#xff1a;DWD层构建&#xff1a;建库实现测试知识点17&#xff1a;DWD层构建&#xff1a;建表实现测…

Packet Tracer – 研究 VLAN 实施

Packet Tracer – 研究 VLAN 实施 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 S1 VLAN 99 172.17.99.31 255.255.255.0 不适用 S2 VLAN 99 172.17.99.32 255.255.255.0 不适用 S3 VLAN 99 172.17.99.33 255.255.255.0 不适用 PC1 NIC 172.17.10.2…

Linux部署Gitlab/上传项目

一、提前准备 1.1安装依赖工具 yum install -y curl policycoreutils-python openssh-serversystemctl start sshd systemctl enable sshd 1.2安装Postfix邮件服务器 #安装 postfix yum install -y postfix#启动 postfix 并设置为开机启动 systemctl enable postfix systemctl …