软件设计建造者模式

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

运行截图

原文地址:https://www.cnblogs.com/Arisf/p/15685548.html