Sobes.tech
Back to questions
Junior — Middle
76

Какое основное отличие между паттернами Builder и Factory в объектно-ориентированном программировании?

Companies where asked
Мидлэнд
bip.ru

Answer from AI

sobes.tech AI

Основное отличие между паттернами Builder и Factory заключается в их назначении и процессе создания объектов.

  • Factory (Фабрика) — это паттерн, который отвечает за создание объектов определённого семейства или типа. Он скрывает логику выбора конкретного класса для создания и возвращает готовый объект. Обычно используется, когда нужно создавать объекты с разной реализацией, но с одинаковым интерфейсом.

  • Builder (Строитель) — паттерн, который позволяет пошагово создавать сложный объект, отделяя процесс конструирования от представления. Он полезен, когда объект состоит из множества частей и конфигураций, и нужно гибко управлять процессом сборки.

Пример:

  • Factory создаёт разные виды автомобилей (седан, внедорожник) по запросу.
  • Builder позволяет собрать автомобиль по частям: двигатель, колёса, кузов, опции, шаг за шагом.
// Factory
protocol Car { func drive() }
class Sedan: Car { func drive() { print("Driving sedan") } }
class SUV: Car { func drive() { print("Driving SUV") } }

class CarFactory {
    static func createCar(type: String) -> Car? {
        switch type {
        case "sedan": return Sedan()
        case "suv": return SUV()
        default: return nil
        }
    }
}

// Builder
class CarBuilder {
    private var engine: String = ""
    private var wheels: Int = 0

    func setEngine(_ engine: String) -> CarBuilder {
        self.engine = engine
        return self
    }

    func setWheels(_ count: Int) -> CarBuilder {
        self.wheels = count
        return self
    }

    func build() -> Car {
        // Возвращаем объект с заданными параметрами
        return CustomCar(engine: engine, wheels: wheels)
    }
}

class CustomCar: Car {
    let engine: String
    let wheels: Int
    init(engine: String, wheels: Int) {
        self.engine = engine
        self.wheels = wheels
    }
    func drive() {
        print("Driving car with engine: \(engine) and wheels: \(wheels)")
    }
}