我与GPT老师的对话-设计模式之建造者模式

Diitich:

建造者模式的概念和结构

GPT:

建造者模式(Builder Pattern),也叫生成器模式,是一种创建型设计模式。在该模式中,将一个复杂对象的构建过程与其表示相分离,使得同样的构建过程可以创建不同的表示。也就是说,建造者模式将一个复杂对象的创建过程(拆分到各个步骤)和它的部件(组成结构)分离开,用一个指挥者(Director)来组织分步建造过程,实现从零部件到整体组装的生产过程。它提供了一种分离客户端(Client)与制造包装复杂对象的类的耦合方法,在软件开发中应用较为广泛。常常用来创建复杂对象,且这些对象可能需要不同的步骤而一步步创建。该对象的产品内部属性本质相同,但是其完整构造(属性的赋值)步骤可能不同。
建造者模式包含以下角色:
Product(产品角色):表示被建造的复杂对象,它包含多个组成部件;
Builder(抽象建造者):包含创建产品各个子部件的抽象方法;
ConcreteBuilder(具体建造者):实现 Builder 接口,完成复杂产品的各个部件的具体创建方法;
Director(指挥者):负责调用 ConcreteBuilder 的具体方法,来完成复杂对象的创建;
Client(客户端):负责调用建造者模式来创建对象。

Diitich:

根据以上建造者模式的角色,用Java举例说明建造者模式,并写明代码的注释

GPT:

Product 角色
// 表示被建造的复杂对象,它包含多个组成部件
public class Computer {
    private String type;
    private String processor;
    private String ram;
    private String hardDisk;
    
    public Computer(String type, String processor, String ram, String hardDisk) {
        this.type = type;
        this.processor = processor;
        this.ram = ram;
        this.hardDisk = hardDisk;
    }

    public String getType() {
        return type;
    }

    public String getProcessor() {
        return processor;
    }

    public String getRam() {
        return ram;
    }

    public String getHardDisk() {
        return hardDisk;
    }

    @Override
    public String toString() {
        return "Computer [ type=" + type + ", processor=" + processor + ", ram=" + ram + ", hardDisk=" + hardDisk + "]";
    }
}
Builder 角色
// 建造者接口,包含创建产品各个子部件的抽象方法
public interface ComputerBuilder {
    public void setType(String type);
    public void setProcessor(String processor);
    public void setRam(String ram);
    public void setHardDisk(String hardDisk);
    public Computer build();
}
ConcreteBuilder 角色
// 具体建造者,实现 Builder 接口,完成复杂产品的各个部件的具体创建方法
public class LaptopBuilder implements ComputerBuilder {
    private Computer computer;
    
    public LaptopBuilder() {
        computer = new Computer("Laptop", "", "", "");
    }

    @Override
    public void setType(String type) {
        computer.setType(type);
    }

    @Override
    public void setProcessor(String processor) {
        computer.setProcessor(processor);
    }

    @Override
    public void setRam(String ram) {
        computer.setRam(ram);
    }

    @Override
    public void setHardDisk(String hardDisk) {
        computer.setHardDisk(hardDisk);
    }

    @Override
    public Computer build() {
        return computer;
    }
}

Director 角色
// 指挥者,负责调用 ConcreteBuilder 的具体方法,来完成复杂对象的创建
public class Store {
    private ComputerBuilder computerBuilder;
    
    public Store(ComputerBuilder computerBuilder) {
        this.computerBuilder = computerBuilder;
    }
    
    public void constructComputer() {
        computerBuilder.setType("Laptop");
        computerBuilder.setProcessor("Intel Core i5");
        computerBuilder.setRam("8GB DDR4");
        computerBuilder.setHardDisk("256GB SSD");
    }
    
    public Computer getComputer() {
        return computerBuilder.build();
    }
}
Client 角色
// 客户端,负责调用建造者模式来创建对象
public class Main {
    public static void main(String[] args) {
        ComputerBuilder laptopBuilder = new LaptopBuilder();
        Store store = new Store(laptopBuilder);
        store.constructComputer();
        Computer computer = store.getComputer();
        System.out.println(computer);
    }
}

UML类图如下:
在这里插入图片描述

在上述代码中,我们使用了多个类来实现建造者模式。最终,我们使用 Main 类作为客户端,从而使用 LaptopBuilder 类创建了一个新的 Computer 对象,并输出了该对象。

总之,建造者模式将对象的构建过程从其表示中分离开,以便能够使用相同的构建过程来创建不同类型的对象。这种模式使得对象的构建过程更加灵活、可扩展且易于理解。

Diitich:

建造者模式在java框架中的的应用场景

GPT:

建造者模式在 Java 框架中的应用场景比较广泛,我们来了解一下其中的几个场景。
1.StringBuilder 和 StringBuffer 类:在 Java 中,StringBuilder 和 StringBuffer 类都是用建造者模式实现的。它们都提供了方法来构建字符串,这些方法每次都会返回当前对象本身,以便能够支持链式调用。它们实际上是以 Builder 模式的方式实现了字符串的构建。
2.Spring框架中的 BeanDefinitionBuilder 类:Spring框架中,可以使用 BeanDefinitionBuilder 类来动态的创建 BeanDefinition 对象,实现类似于 XML 配置 <bean/> 标签的功能。BeanDefinitionBuilder 类是一个建造者类,其内部包含了多个使用方法构建 BeanDefinition 对象的方法。
3.Mybatis框架中的 SqlSessionFactoryBuilder 类:Mybatis框架中,可以使用 SqlSession 类来构建数据库会话对象。SqlSessionFactoryBuilder 类是一个建造者类,用于构建 SqlSessionFactory 对象,这个对象是Mybatis中最顶层的接口,提供了数据库操作的所有方法。这里的建造者模式体现在:构建 SqlSessionFactory 对象需要的参数很多,而且过程比较繁琐,使用建造者模式可将复杂的构建过程简化,使得代码更具有可读性、可维护性。
总之,建造者模式在Spring、Mybatis等框架中也是比较常见的,利用建造者模式可以将复杂对象的构造过程简化并分离出来,让业务逻辑更加清晰,提高了代码复用性和可维护性。

猜你喜欢

转载自blog.csdn.net/m0_37742400/article/details/130132730
今日推荐