实验要求:
电脑组装工厂可以将CPU、内存、硬盘、主机、显示器、等硬件设备组装在一起构成一台完整的电脑,且构成的电脑可以是笔记本,也可以是台式机,还可以是不提供显示器的服务器主机。对于用户而言,无需关心电脑的组成设备和组装过程,工厂返回给用户的是完整的的电脑对象。使用生成器模式(建造者模式)实现电脑组装过程,要求绘制类图并使用java代码编程模拟实现
类结构图 :
computer:
package com.ag.builder;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Computer {
private String cpu;
private String ram;
private String hardDisk;//硬盘
private String mainframe;//主机
private String monitor;//显示屏
//getter和setter
}
ComputerBuilder:
package com.ag.builder;
public class Notebook extends ComputerBuilder{
@Override
public void buildCpu() {
computer.setCpu("i7-9750H");
}
@Override
public void buildRam() {
computer.setRam("16G DDR4");
}
@Override
public void buildHardDisk() {
computer.setHardDisk("固态硬盘");
}
@Override
public void buildMainframe() {
computer.setMainframe("笔记本");
}
@Override
public void buildMonitor() {
computer.setMonitor("144hz液晶屏幕");
}
}
ComputerAssembleDirector:
package com.ag.builder;
public class ComputerAssembleDirector {
private ComputerBuilder computerBuilder;
public void setComputerBuilder(ComputerBuilder computerBuilder){
this.computerBuilder = computerBuilder;
}
public Computer assemble() {
computerBuilder.buildCpu();
computerBuilder.buildRam();
computerBuilder.buildHardDisk();
computerBuilder.buildMainframe();
computerBuilder.buildMonitor();
return computerBuilder.getComputer();
}
}
Desktop:
package com.ag.builder;
public class Desktop extends ComputerBuilder{
@Override
public void buildCpu() {
computer.setCpu("9900K");
}
@Override
public void buildRam() {
computer.setRam("DDR2666");
}
@Override
public void buildHardDisk() {
computer.setHardDisk("三星970 EVO 500GB");
}
@Override
public void buildMainframe() {
computer.setMainframe("鑫谷光韵7plus");
}
@Override
public void buildMonitor() {
computer.setMonitor("AOC");
}
}
XMLUtil:
package com.ag.builder;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
public class XMLUtil {
public static Object getBean(){
DocumentBuilderFactory dFactory = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder builder = dFactory.newDocumentBuilder();
Document document = builder.parse(new File("E:\\code\\code2\\src\\main\\java\\com\\ag\\config\\builder.xml"));
NodeList nList = document.getElementsByTagName("className");
Node classNode = nList.item(0).getFirstChild();
String carBrand =classNode.getNodeValue();
//通过类名生成实例对象并将其返回
Class c=Class.forName(carBrand);
Object obj=c.newInstance();
return obj;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
builder.xml:
<config>
<className>com.ag.builder.Desktop</className>
</config>
实验结果 :
建造者优点:
1.客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象2.每一个具体建造者都相对独立,与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,扩展方便,符合开闭原则3.可以更加精细地控制产品的创建过程
建造者缺点:
1.建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,不适合使用建造者模式,因此其使用范围受到一定的限制2.如果产品的内部变化复杂,可能会需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加了系统的理解难度和运行成本