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等框架中也是比较常见的,利用建造者模式可以将复杂对象的构造过程简化并分离出来,让业务逻辑更加清晰,提高了代码复用性和可维护性。