一、实验目的和要求:
2.建造者模式的运用
(1)案例背景:
计算机组装工厂可以将CPU,内存,硬盘,主机,显示器等硬件设备组装在一起构成一台完整的计算机,且构成的计算机可以是笔记本电脑,也可以是台式机,还可以是不提供显示器的服务器主机。对于用户来言,无需关心计算机的组成设备和组装过程,工厂返回给用户的是完整的计算机对象。所以我们可以使用建造者模式来实现计算机的组成过程,请绘制出类图并编程实现
(2)实现步骤:
- 根据题意,使用建造者模式并画出类图。类图中应包含抽象建造者类ComputerBuilder,复合产品类Computer,具体建造者类Notebook,Desktop和Server,其中台式机和服务器主机使用相同的CPU,内存,硬盘和主机,但是服务器不包含显示器,而笔记本使用自己独自的一套硬件设备。此外还需要指挥者类ComputerAssembleDirector,此类中应有将硬件设备组合在一起的建造方法assemble()并返回用户需要的具体计算机
- 根据类图,实现上述类的具体代码以及用户类Client和辅助类XMLUtil以实现通过XML文件来制造不同的计算机
- 更改XML中的属性,观察用户类是否能够获取到不同的计算机以及这些计算机的组装是否符合要求
(3)案例总结:
- 建造者模式主要运用于:
- 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员变量
- 需要生成的产品对象的属性相互依赖,需要指定其生成顺序
- 对象的创建过程独立于创建该对象的类。在建造者模式中通过引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类和客户类中
- 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品
三、主要实验内容及结果:
代码结构:
详细代码:
ComputerBuilder
import BuilderPattern.complexProduct.Computer;
//建造者类
public abstract class ComputerBuilder {
protected Computer computer = new Computer();
public abstract void buildCPUs();//CPU
public abstract void buildmonitor();//显示器
public abstract void buildhardwareEquipment();//笔记本使用自己独自的一套硬件设备
public Computer getComputer(){
return computer;
}
}
Computer
//复合产品类
public class Computer {
private String CPUs;//CPU
private String monitor;//显示器
private String hardwareEquipment;//笔记本使用自己独自的一套硬件设备
public String getCPUs() {
return CPUs;
}
public void setCPUs(String CPUs) {
this.CPUs = CPUs;
}
public String getMonitor() {
return monitor;
}
public void setMonitor(String monitor) {
this.monitor = monitor;
}
public String getHardwareEquipment() {
return hardwareEquipment;
}
public void setHardwareEquipment(String hardwareEquipment) {
this.hardwareEquipment = hardwareEquipment;
}
}
Desktop
import BuilderPattern.abstractBuilder.ComputerBuilder;
public class Desktop extends ComputerBuilder {
public void buildCPUs(){
computer.setCPUs("CPU 内存 硬盘 主机 ");
}
public void buildmonitor(){
computer.setMonitor("显示器 ");
}
public void buildhardwareEquipment(){
computer.setHardwareEquipment("null");
}
}
NoteBook
import BuilderPattern.abstractBuilder.ComputerBuilder;
public class NoteBook extends ComputerBuilder {
public void buildCPUs(){
computer.setCPUs("null ");
}
public void buildmonitor(){
computer.setMonitor("null ");
}
public void buildhardwareEquipment(){
computer.setHardwareEquipment("笔记本使用自己独自的一套硬件设备");
}
}
Server
import BuilderPattern.abstractBuilder.ComputerBuilder;
public class Server extends ComputerBuilder {
public void buildCPUs(){
computer.setCPUs("CPU 内存 硬盘 主机 ");
}
public void buildmonitor(){
computer.setMonitor("null ");
}
public void buildhardwareEquipment(){
computer.setHardwareEquipment("null");
}
}
ComputerAssembleDirector
import BuilderPattern.abstractBuilder.ComputerBuilder;
import BuilderPattern.complexProduct.Computer;
public class ComputerAssembleDirector {
private ComputerBuilder cb;
public void setCb(ComputerBuilder cb) {
this.cb = cb;
}
public Computer constract(){
cb.buildCPUs();
cb.buildmonitor();
cb.buildhardwareEquipment();
return cb.getComputer();
}
}
XMLUtil
import org.w3c.dom.*;
import javax.xml.parsers.*;
import org.xml.sax.SAXException;
import java.io.*;
public class XMLUtil {
public static Object getBean(){
try {
//创建文档对象
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document doc;
doc = builder.parse(new File("src/BuilderPattern/Utils/config.xml"));
//获取包含支付方式名称的文本节点
NodeList nl = doc.getElementsByTagName("className");
Node classNode=nl.item(0).getFirstChild();
String cName=classNode.getNodeValue();
//通过类名生成实例对象并将其返回
Class c=Class.forName(cName);
Object obj=c.newInstance();
return obj;
}catch (Exception e){
e.printStackTrace();
return null;
}
}
}
config.xml
<?xml version="1.0" ?>
<config>
<className>BuilderPattern.complexBuilder.Desktop</className>
</config>
Client
import BuilderPattern.Utils.XMLUtil;
import BuilderPattern.abstractBuilder.ComputerBuilder;
import BuilderPattern.complexProduct.Computer;
import BuilderPattern.conductor.ComputerAssembleDirector;
import abstractFactory.abstractFactory.AbstractFactory;
public class Client {
public static void main(String[] args) {
ComputerBuilder cb = (ComputerBuilder) XMLUtil.getBean();
ComputerAssembleDirector cad = new ComputerAssembleDirector();
cad.setCb(cb);
Computer computer = cad.constract();
System.out.println("计算机的组成:");
System.out.println(computer.getCPUs());
System.out.println(computer.getMonitor());
System.out.println(computer.getHardwareEquipment());
}
}
实验结果: