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

实验要求:

电脑组装工厂可以将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.如果产品的内部变化复杂,可能会需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大,增加了系统的理解难度和运行成本

  • 5
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值