建造者模式例题

        假定现在有这样一个需求:电脑可以由主板、硬盘、CPU、内存、显卡、显示器和键盘等元素构成,华硕公司可以生产里面的各种元素,Lenovo公司也可以生产里面的各种元素。假定你现在就想要一台电脑,这个电脑可以全部是来自华硕的品牌机,也可以是来自Lenovo的品牌机,也可以一部分元素来自华硕、另一部分来自Lenovo,请根据上述要求对代码进行设计,给出设计思路和源码。

        以下这段代码展示了一个简单的电脑组装系统。首先定义了不同的电脑元素接口,如主板、硬盘、CPU等。然后定义了电脑类 Computer,包含各种电脑组件,并通过 set 方法设置各个组件,最后通过 showInfo 方法展示电脑信息。

        接着有一个电脑建造者类 ComputerBuilder,其中包含了建造不同品牌电脑的方法,如 buildHSComputer(华硕电脑)、buildLenovoComputer(联想电脑)、buildCustomComputer(混合电脑),最后通过 getComputer 方法获取组装好的电脑。

        最后是 Director 类,包含了导演的角色,负责调用建造者类中的方法来组装不同品牌的电脑,并展示电脑的信息。

电脑元素接口:

//电脑元素接口
interface IMotherboard {void makeIMotherboard();}interface IHardDisk {void makeIHardDisk();}interface ICPU {void makeICPU();}interface IMemory {void makeIMemory();}interface IGraphicsCard {void makeIGraphicsCard();}interface IDisplay {void makeIDisplay();}interface IKeyboard {void makeIKeyboard();}

电脑类

//电脑
public class Computer {private IMotherboard motherboard;private IHardDisk hardDisk;private ICPU cpu;private IMemory memory;private IGraphicsCard graphicsCard;private IDisplay display;private IKeyboard keyboard;public void setMotherboard(IMotherboard motherboard) {this.motherboard = motherboard;}public void setHardDisk(IHardDisk hardDisk) {this.hardDisk = hardDisk;}public void setCpu(ICPU cpu) {this.cpu = cpu;}public void setMemory(IMemory memory) {this.memory = memory;}public void setGraphicsCard(IGraphicsCard graphicsCard) {this.graphicsCard = graphicsCard;}public void setDisplay(IDisplay display) {this.display = display;}public void setKeyboard(IKeyboard keyboard) {this.keyboard = keyboard;}public void showInfo() {if (motherboard != null) {motherboard.makeIMotherboard();}if (hardDisk != null) {hardDisk.makeIHardDisk();}if (cpu != null) {cpu.makeICPU();}if (memory != null) {memory.makeIMemory();}if (graphicsCard != null) {graphicsCard.makeIGraphicsCard();}if (display != null) {display.makeIDisplay();}if (keyboard != null) {keyboard.makeIKeyboard();}}}}

电脑建造者类

//电脑建造者
class ComputerBuilder {private Computer computer;public ComputerBuilder() {computer = new Computer();}public void buildHSComputer() {//华硕电脑computer.setMotherboard(new HSMotherboard());computer.setHardDisk(new HSHardDisk());computer.setCpu(new HSCPU());computer.setMemory(new HSMemory());computer.setGraphicsCard(new HSGraphicsCard());computer.setDisplay(new HSDisplay());computer.setKeyboard(new HSKeyboard());}public void buildLenovoComputer() {//联想电脑computer.setMotherboard(new LenovoMotherboard());computer.setHardDisk(new LenovoHardDisk());computer.setCpu(new LenovoCPU());computer.setMemory(new LenovoMemory());computer.setGraphicsCard(new LenovoGraphicsCard());computer.setDisplay(new LenovoDisplay());computer.setKeyboard(new LenovoKeyboard());}public void buildCustomComputer() {//建造混合电脑computer.setMotherboard(new HSMotherboard());computer.setHardDisk(new LenovoHardDisk());computer.setCpu(new LenovoCPU());computer.setMemory(new HSMemory());computer.setGraphicsCard(new LenovoGraphicsCard());computer.setDisplay(new LenvovDisplay());computer.setKeyboard(new HSKeyboard());}public Computer getComputer() {//获得组装好的电脑return computer;}}

导演类

//导演类
class Director {private ComputerBuilder builder = new ComputerBuilder();public void buildHSComputer() {// 华硕电脑builder.buildHSComputer();Computer hsComputer = builder.getComputer();hsComputer.showInfo();}public void buildLenovoComputer() {// 联想电脑builder.buildLenovoComputer();Computer lenovoComputer = builder.getComputer();lenovoComputer.showInfo();}public void buildCustomComputer() {// 混合电脑builder.buildCustomComputer();Computer customComputer = builder.getComputer();customComputer.showInfo();}}

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

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

相关文章

GNN学习笔记

1.拉普拉斯矩阵 D是度矩阵,A是邻接矩阵 L的第二个公式常用 L的特征值>0 2.图的整体,节点,边都能代表一个分类/回归问题。 3.GNN的感受野 N-Hop Neighbors,某一点的n阶邻居。n步以内能到达的点。 4.残差连接 最后对图结果的处…

RK3568笔记三十六:LED驱动开发(设备树)

若该文为原创文章,转载请注明原文出处。 记录使用设备树编写一个简单的 LED 灯驱动程序 一、编程思路 程序编写的主要内容为添加 LED 灯的设备树节点、在驱动程序中使用 of 函数获取设备节点中的 属性,编写测试应用程序。 • 首先向设备树添加 LED 设备…

SCSA第八天

防火墙的带宽管理 核心思想 1,带宽限制 --- 限制非关键业务流量占用带宽的比例 2,带宽保证 --- 这里需要保证的是我们关键业务流量;再业务繁忙时,确保关键业务不受影 响; 3,连接数的限制 --- 这也…

如何生成好看的zabbix告警报表并发送邮件

作者 乐维社区(forum.lwops.cn) 许远 一、场景模拟 小东是一名资深的IT运维人员,其直属领导想要了解公司业务系统的健康状态以及小东日常的工作情况等,要求小东每周统计系统告警情况并发邮件给到他。小东所在公司搭建了一套zabbix…

为什么品牌需要做 IP 形象?

品牌做IP形象的原因有多方面,这些原因共同构成了IP形象在品牌建设中的重要性和价值,主要原因有以下几个方面: 增强品牌识别度与记忆点: IP形象作为品牌的视觉符号,具有独特性和辨识性,能够在消费者心中留…

Linux--网络基础

计算机网络背景 计算机网络背景是一个复杂而丰富的领域,涵盖了从计算机单机模式到网络互联的演变过程,以及网络技术的不断发展和创新。 计算机单机模式和独立发展 在早期,计算机主要以单机模式存在,即每台计算机都是独立的&…

锁升级过程中的两次自旋 面试重点

1.什么是自旋 自旋(Spinning)是一种在多线程环境下等待锁的技术。当一个线程尝试获取某个已被其他线程持有的锁时,该线程不会立即进入阻塞状态,而是会在一个循环中持续检查锁的状态,即“自旋”。如果在这个过程中锁被释…

高性能内存对象缓存Memcached

一、Memcached概述 Memcached 是一套开源的高性能分布式内存对象缓存系统,它将所有的数据都存储在内存中,因为内存中会统一维护一张巨大的 Hash 表,所以支持任意存储类型的数据。很多网站使用 Memcached 提高网站的访问速度,尤其是…

SAC-IA粗配准算法记录

1. 算法思路 SAC-IA(Sample Consensus Initial Aligment,SAC-IA)粗配准算法是一种基于局部特征描述子的点云粗配准算法,其需要计算点云的快速点特征直方图(FPFH)来保持对应点对之间的相似关系,根据相似关系来搜索点云中的对应点。其基本原理是采用采样一致性的思想,通过查…

P2712 摄像头

好久没发帖了&#xff0c;放假了来水一波。 代码&#xff1a; #include<iostream> #include<cstring> #include<algorithm> using namespace std;const int N 200010, mod 80112002;int n, m; int nn; int e[N], h[N], ne[N], idx; int q[N], in[N], chu[N…

宝塔安装RabbitMq教程

需要放开15672端口&#xff0c;默认账号密码为guest/guest

前端开发日记——在MacBook上配置Vue环境

前言 大家好&#xff0c;我是来自CSDN的寄术区博主PleaSure乐事。今天是开始学习vue的第一天&#xff0c;我使用的编译器是vscode&#xff0c;浏览器使用的是谷歌浏览器&#xff0c;后续会下载webstorm进行使用&#xff0c;当前学习阶段使用vscode也是可以的&#xff0c;不用担…

Jupyter Notebook安装及基本使用

Jupyter Notebook安装及基本使用 目录 Jupyter Notebook安装及基本使用方式一&#xff1a;Anaconda直接安装方式二&#xff1a;pip命令安装Jupyter使用虚拟环境 方式一&#xff1a;Anaconda直接安装 安装Anaconda 下载地址&#xff0c;输入邮箱&#xff0c;Windows下载 开始安…

【sgWatermark.js】自定义组件:基于Vue2+html2canvas实现全局水印效果

sgWatermark.js源码 import html2canvas from html2canvas; // npm install --save html2canvas (官网&#xff1a;https://html2canvas.hertzen.com) export default {addWatermark({container document.body, // 水印添加到的容器innerHTML "水印文字内容", //…

最大文件句柄数

优质博文&#xff1a;IT-BLOG-CN 灵感来源 一、什么是文件句柄 文件句柄File Handle是操作系统中用于访问文件的一种数据结构&#xff0c;通常是一个整数或指针。文件句柄用于标识打开的文件&#xff0c;每个打开的文件都有一个唯一的文件句柄。 它们是对文件、网络套接字或…

实战:功能强大齐全BBS论坛项目Echo简介

项目简介 Echo 是一套前后端不分离的开源社区系统&#xff0c;基于目前主流 Java Web 技术栈&#xff08;SpringBoot MyBatis MySQL Redis Kafka Elasticsearch Spring Security ...&#xff09;&#xff0c;并提供详细的开发文档和配套教程。包含帖子、评论、私信、系…

查找json中指定节点的值,替换为指定的值

有时我们封装好的实体转化成的json字段的值和第三方要求的不一样&#xff0c;比如我们字段的值是字符串&#xff0c;我们需要使用int类型的值&#xff0c;就需要将这个键的值转化成int类型。 比如将以下 convulsionNumber字段中字符串的值“一次”替换为0 {"convulsionT…

InstaPrism能否平替BayesPrism(贝叶斯棱镜)?

上一期内容提到了BayesPrism算法用于单细胞数据的反卷积&#xff0c;BayesPrism算法在实际应用中非常占用计算资源以及消耗使用者的时间。那么是否有较好的替代包呢&#xff1f; 曾老师告诉了我一个R包—InstaPrism&#xff0c;他希望我将其和BayesPrism算法做个对比。 开发者…

使用Python Turtle绘制圣诞树和装饰

简介(❤ ω ❤) 在这篇文章中&#xff0c;我们将探索如何使用Python的Turtle模块来绘制一个充满节日气氛的圣诞树&#xff0c;以及一些可爱的装饰品。Turtle是一个受Logo语言启发的图形库&#xff0c;非常适合初学者学习编程和创建图形。 码农不是吗喽&#xff08;大学生版&…

【常见开源库的二次开发】基于openssl的加密与解密——单向散列函数(四)

目录&#xff1a; 目录&#xff1a; 一、什么是单项散列函数&#xff1f; 1.1 如何验证文件是否被修改过 1.2 单项散列函数&#xff1a; 二、单向hash抗碰撞 2.1 弱抗碰撞&#xff08;Weak Collision Resistance&#xff09; 2.2 强抗碰撞&#xff08;Strong Collision Resista…