设计模式-建造者模式实例-02

一、实验目的和要求:

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());

    }
}

实验结果:

 

 

 

 

 

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java建造者设计模式是一种创建对象的设计模式,它可以通过一步一步地构建复杂对象,使得对象的构建过程更加灵活和可控。在建造者模式中,通过定义一个Builder类来设置和构建对象的属性,然后通过调用build方法实例化对象。 建造者设计模式有以下几个优点: 1. 通过建造者模式可以将对象的构建过程与表示分离,使得同样的构建过程可以创建不同的表示。 2. 可以通过链式调用的方式设置对象的属性,使得代码更加可读和易于维护。 3. 可以防止对象在实例化之前就被调用,从而避免了对象的不一致性。 4. 解决了JavaBean模式中线程安全问题。 下面是一个示例代码,展示了如何使用Java建造者设计模式: ```java public class User { private String id; private String name; private String password; private String phone; private User(UserBuilder builder) { this.id = builder.id; this.name = builder.name; this.password = builder.password; this.phone = builder.phone; } public String getId() { return id; } public String getName() { return name; } public String getPassword() { return password; } public String getPhone() { return phone; } public static class UserBuilder { private String id; private String name; private String password; private String phone; public UserBuilder setId(String id) { this.id = id; return this; } public UserBuilder setName(String name) { this.name = name; return this; } public UserBuilder setPassword(String password) { this.password = password; return this; } public UserBuilder setPhone(String phone) { this.phone = phone; return this; } public User build() { return new User(this); } } } // 使用建造者模式创建User对象 User user = new User.UserBuilder() .setId("001") .setName("John") .setPassword("123456") .setPhone("1234567890") .build(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值