MST

星途 面试题库

面试题:Java建造者模式与其他创建型模式的区别

在Java中,建造者模式与工厂模式、单例模式同属创建型模式,请详细分析建造者模式与它们在应用场景、实现方式以及设计哲学上的区别。
11.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

应用场景区别

  1. 建造者模式
    • 适用于创建复杂对象的场景,该对象的创建过程包含多个步骤,且这些步骤的顺序可能很重要,或者对象的不同表示形式需要不同的创建步骤。例如,创建一个复杂的游戏角色,其创建过程可能包括设置角色的外貌、属性、技能等多个步骤,且不同职业的角色创建步骤和参数不同。
  2. 工厂模式
    • 用于创建对象的场景,当创建对象的逻辑较为复杂,需要根据不同条件创建不同类型的对象时使用。比如,根据用户输入的图形类型(圆形、矩形等)创建相应的图形对象,工厂模式将对象的创建和使用分离,使代码更易维护和扩展。
  3. 单例模式
    • 确保在整个应用程序中,某个类只有一个实例存在,并且提供一个全局访问点。常用于需要共享资源的场景,如数据库连接池、日志记录器等,保证整个系统中只有一个实例在运行,避免资源的重复创建和浪费。

实现方式区别

  1. 建造者模式
    • 包含一个抽象建造者接口,具体建造者实现该接口,负责对象各个部分的构建。还有一个指挥者类,它控制建造过程,调用建造者的方法按顺序构建对象。客户端与指挥者交互,指挥者调用具体建造者完成复杂对象的构建。例如:
// 抽象建造者
abstract class Builder {
    abstract void buildPartA();
    abstract void buildPartB();
    abstract Product getResult();
}

// 具体建造者
class ConcreteBuilder extends Builder {
    private Product product = new Product();
    @Override
    void buildPartA() {
        product.add("Part A");
    }
    @Override
    void buildPartB() {
        product.add("Part B");
    }
    @Override
    Product getResult() {
        return product;
    }
}

// 产品
class Product {
    private List<String> parts = new ArrayList<>();
    void add(String part) {
        parts.add(part);
    }
    void show() {
        System.out.println("Product parts: " + parts);
    }
}

// 指挥者
class Director {
    Builder builder;
    Director(Builder builder) {
        this.builder = builder;
    }
    void construct() {
        builder.buildPartA();
        builder.buildPartB();
    }
}
  1. 工厂模式
    • 简单工厂模式是工厂类有一个创建对象的静态方法,根据传入的参数创建不同类型的对象。工厂方法模式是定义一个创建对象的抽象方法,由具体子类决定创建何种对象。抽象工厂模式则是创建一系列相关或相互依赖对象的工厂接口,具体工厂实现该接口创建所需对象。以简单工厂模式为例:
// 产品接口
interface Product {
    void use();
}

// 具体产品
class ConcreteProduct implements Product {
    @Override
    void use() {
        System.out.println("Using ConcreteProduct");
    }
}

// 简单工厂
class SimpleFactory {
    static Product createProduct(String type) {
        if ("concrete".equals(type)) {
            return new ConcreteProduct();
        }
        return null;
    }
}
  1. 单例模式
    • 常见的实现方式有饿汉式和懒汉式。饿汉式在类加载时就创建实例,保证线程安全。懒汉式是在第一次使用时才创建实例,需要注意线程安全问题。例如饿汉式:
class Singleton {
    private static final Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}

设计哲学区别

  1. 建造者模式
    • 强调对象创建过程的封装和步骤的控制,将复杂对象的创建过程分解为多个简单步骤,通过不同的建造者实现可以创建不同表示形式的对象,关注对象的构建过程。
  2. 工厂模式
    • 重点在于对象创建的封装,将对象的创建逻辑从使用它的代码中分离出来,提高代码的可维护性和可扩展性,关注对象的创建。
  3. 单例模式
    • 关注对象的唯一性,确保整个系统中特定类只有一个实例,提供一种全局访问机制,主要解决资源共享和避免重复创建的问题。