建造者模式
使用建造者模式,完成下述任务:计算机组装工厂可以将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;
}
运行截图



浙公网安备 33010602011771号