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