软件设计-建造者模式
使用建造者模式,完成下述任务:计算机组装工厂可以将CPU、内存、硬盘、主机等硬件设备组装在一起构成计算机,计算机的类型可以是笔记本,也可以是台式机。
类图
代码
java
package rjsj.no5; public class SubComputerBuilderLaptop extends ComputerBuilder{ public void buildCPU() { computer.setCPU("使用移动端CPU"); } public void buildRAM(){ computer.setRAM("使用移动端内存条"); } public void buildROM(){ computer.setROM("使用移动端硬盘"); } public void buildMaster(){ computer.setMaster("使用笔记本摸模具"); } }
package rjsj.no5; import javax.xml.parsers.*; import org.w3c.dom.*; import org.xml.sax.SAXException; import java.io.*; public class XMLUtil { //该方法用于从XML配置文件中提取具体类类名,并返回一个实例对象 public static Object getBean() { try { //创建文档对象 DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = dFactory.newDocumentBuilder(); Document doc; doc = builder.parse(new File("src/rjsj/no5/config.xml")); //获取包含类名的文本节点 NodeList nl = doc.getElementsByTagName("className"); Node classNode=nl.item(0).getFirstChild(); String cName=classNode.getNodeValue(); //通过类名生成实例对象并将其返回 Class c=Class.forName("rjsj.no5." + cName); Object obj=c.newInstance(); return obj; } catch(Exception e) { e.printStackTrace(); return null; } } }
package rjsj.no5; public class Client { public static void main(String args[]) { //动态确定组装的计算机种类(笔记本Laptop/台式机Desktop) ComputerBuilder computerBuilder=(ComputerBuilder) XMLUtil.getBean(); //指定电脑公司员工为指挥者 ComputerStaff staff = new ComputerStaff(); //员工准备组装 staff.setComputerBuilder(computerBuilder); //用户获得产品 Computer computer = staff.construct(); System.out.println("计算机组成:"); System.out.println(computer.getMaster()); System.out.println(computer.getCPU()); System.out.println(computer.getRAM()); System.out.println(computer.getROM()); } }
package rjsj.no5; public class Computer { //零部件 private String CPU; private String RAM; private String ROM; private String Master; public String getCPU() { return CPU; } public void setCPU(String CPU) { this.CPU = CPU; } public String getRAM() { return RAM; } public void setRAM(String RAM) { this.RAM = RAM; } public String getROM() { return ROM; } public void setROM(String ROM) { this.ROM = ROM; } public String getMaster() { return Master; } public void setMaster(String master) { Master = master; } }
package rjsj.no5; public abstract class ComputerBuilder { protected Computer computer = new Computer(); public abstract void buildCPU(); public abstract void buildRAM(); public abstract void buildROM(); public abstract void buildMaster(); public Computer getComputer(){ return computer; } }
package rjsj.no5; public class ComputerStaff { private ComputerBuilder computerBuilder; public void setComputerBuilder(ComputerBuilder computerBuilder){ this.computerBuilder = computerBuilder; } public Computer construct(){ computerBuilder.buildCPU(); computerBuilder.buildRAM(); computerBuilder.buildROM(); computerBuilder.buildMaster(); return computerBuilder.getComputer(); } }
package rjsj.no5; public class SubComputerBuilderDesktop extends ComputerBuilder{ public void buildCPU() { computer.setCPU("使用桌面端CPU"); } public void buildRAM(){ computer.setRAM("使用桌面端内存条"); } public void buildROM(){ computer.setROM("使用桌面端硬盘"); } public void buildMaster(){ computer.setMaster("使用台式机机箱"); } }
<?xml version="1.0"?> <config> <className>SubComputerBuilderLaptop</className> </config>
C++
#include <iostream> using namespace std; class Computer{ public: virtual void setCpu(){}; virtual void setNc(){}; virtual void setYp(){}; virtual void setZj(){}; }; class LapComputer:public Computer{ private: string CPU=""; string nc=""; string yp=""; public: string tostring() { return "LapComputer [" + CPU + ", " + nc + ", " + yp + "]"; } void setCpu() { // TODO Auto-generated method stub CPU="CPU"; } void setNc() { // TODO Auto-generated method stub nc="内存条"; } void setYp() { // TODO Auto-generated method stub yp="硬盘"; } void setZj() { // TODO Auto-generated method stub } }; class PCComputer:public Computer{ private: string CPU=""; string nc=""; string yp=""; string zj=""; public: void setCpu() { // TODO Auto-generated method stub CPU="CPU"; } void setNc() { // TODO Auto-generated method stub nc="内存条"; } void setYp() { // TODO Auto-generated method stub yp="硬盘"; } void setZj() { // TODO Auto-generated method stub zj="主机"; } string tostring() { return "PCComputer [" + CPU + ", " + nc + ", " + yp + ", " + zj + "]"; } string getCPU() { return CPU; } void setCPU(string cPU) { CPU = cPU; } string getNc() { return nc; } void setNc(string nc) { nc = nc; } string getYp() { return yp; } void setYp(string yp) { yp = yp; } }; class Builder{ public: virtual void produceCPU(){}; virtual void produceNC(){}; virtual void ProduceYP(){}; virtual void ProduceZJ(){}; virtual Computer* build(int n){}; }; class ConcreteBuilder:public Builder{ private: Computer *cp; public: Computer* build(int t) { cout<<"正在安装... ..."<<endl; //1是笔记本 2是台式 if(t==1) { LapComputer c; cp=&c; produceCPU(); produceNC(); ProduceYP(); cout<<"笔记本安装成功"<<endl; cout<<c.tostring()<<endl; } else if(t==2) { PCComputer c; cp=&c; produceCPU(); produceNC(); ProduceYP(); ProduceZJ(); cout<<"台式电脑安装成功"<<endl; cout<<c.tostring()<<endl; } else { ; } } void produceCPU() { // TODO Auto-generated method stub cp->setCpu(); cout<<"安装CPU"<<endl; } void produceNC() { // TODO Auto-generated method stub cp->setNc(); cout<<"安装内存条"<<endl; } void ProduceYP() { // TODO Auto-generated method stub cp->setYp(); cout<<"安装硬盘"<<endl; } void ProduceZJ() { // TODO Auto-generated method stub cp->setZj(); cout<<"安装主机"<<endl; } }; int main() { int n; ConcreteBuilder b; Builder* bd=&b; cout<<"请选择你要的电脑类型 1为笔记本电脑 2位台式电脑"<<endl; cin>>n; if(n==1||n==2) { bd->build(n); }else { cout<<"请输入正确选项"<<endl; } return 0; }
运行截图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!