MST

星途 面试题库

面试题:Java建造者模式在领域模型构建中的基本应用

请阐述在Java领域模型构建中,建造者模式相比于其他创建型模式(如工厂模式)有哪些优势?并结合简单代码示例说明如何使用建造者模式构建一个领域模型,比如一个用户信息模型,该模型包含姓名、年龄、地址等属性。
42.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

建造者模式相比于工厂模式的优势

  1. 更精细的对象创建控制
    • 工厂模式通常用于创建相对简单的对象,一旦创建逻辑确定,对象的创建过程相对固定。例如简单工厂模式,客户端只需传入参数,工厂就返回对应的产品对象,客户端无法对创建过程进行更多干预。
    • 建造者模式将对象的创建过程分解为多个步骤,客户端可以更精细地控制每个步骤,从而创建出复杂且定制化程度高的对象。比如在创建用户信息模型时,可以先设置姓名,再设置年龄,最后设置地址,每个步骤都可根据需求灵活调整。
  2. 更好的代码复用性
    • 工厂模式中不同产品的创建逻辑可能差异较大,代码复用性有限。例如在一个生产不同电子产品的工厂中,生产手机和生产电脑的逻辑完全不同,难以复用代码。
    • 建造者模式中,不同具体建造者可以复用相同的创建框架(导演类),仅在具体步骤实现上有所差异。如创建不同类型用户(普通用户、VIP用户)信息模型时,创建框架相同,只是某些属性设置不同,提高了代码复用性。
  3. 分离对象创建与表示
    • 工厂模式将对象的创建和使用紧密耦合,客户端调用工厂方法直接获取对象。
    • 建造者模式将对象的创建和表示分离,客户端只需要关心如何构建对象,而不需要关心对象的具体表示形式。例如在创建用户信息模型时,客户端通过建造者构建对象,而对象内部具体如何存储和表示这些信息(如是否使用特定的数据结构),客户端无需了解。

使用建造者模式构建用户信息模型代码示例

// 用户信息模型
class User {
    private String name;
    private int age;
    private String address;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}

// 抽象建造者
abstract class UserBuilder {
    protected User user = new User();

    public abstract void buildName();
    public abstract void buildAge();
    public abstract void buildAddress();

    public User getUser() {
        return user;
    }
}

// 具体建造者
class NormalUserBuilder extends UserBuilder {
    @Override
    public void buildName() {
        user.setName("普通用户姓名");
    }

    @Override
    public void buildAge() {
        user.setAge(30);
    }

    @Override
    public void buildAddress() {
        user.setAddress("普通用户地址");
    }
}

// 导演类
class UserDirector {
    private UserBuilder userBuilder;

    public UserDirector(UserBuilder userBuilder) {
        this.userBuilder = userBuilder;
    }

    public User constructUser() {
        userBuilder.buildName();
        userBuilder.buildAge();
        userBuilder.buildAddress();
        return userBuilder.getUser();
    }
}

// 客户端调用
public class BuilderPatternExample {
    public static void main(String[] args) {
        UserBuilder normalUserBuilder = new NormalUserBuilder();
        UserDirector userDirector = new UserDirector(normalUserBuilder);
        User user = userDirector.constructUser();
        System.out.println(user);
    }
}

在上述代码中,User类是我们要构建的领域模型。UserBuilder是抽象建造者,定义了构建User对象各属性的抽象方法。NormalUserBuilder是具体建造者,实现了抽象方法来构建普通用户的信息。UserDirector是导演类,负责安排构建步骤。在客户端中,通过UserDirectorNormalUserBuilder构建出了User对象。