(java)创建型模式之生成器模式

实验要求:

电脑组装工厂可以将CPU、内存、硬盘、主机、显示器、等硬件设备组装在一起构成一台完整的电脑,且构成的电脑可以是笔记本,也可以是台式机,还可以是不提供显示器的服务器主机。对于用户而言,无需关心电脑的组成设备和组装过程,工厂返回给用户的是完整的的电脑对象。使用生成器模式(建造者模式)实现电脑组装过程,要求绘制类图并使用java代码编程模拟实现

类结构图 :

(java)创建型模式之生成器模式_第1张图片

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:


    com.ag.builder.Desktop

实验结果 :

(java)创建型模式之生成器模式_第2张图片

 建造者优点:

1.客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象2.每一个具体建造者都相对独立,与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者,扩展方便,符合开闭原则3.可以更加精细地控制产品的创建过程

建造者缺点:

1.建造者模式所创建的产品一般具有较多的共同点,其组成部分相似,如果产品之间的差异性很大,不适合使用建造者模式,因此其使用范围受到一定的限制2.如果产品的内部变化复杂,可能会需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加了系统的理解难度和运行成本

你可能感兴趣的:(java)